在这个简单的要求/骨干网应用
https://github.com/thisishardcoded/require-prob
为什么app.js看到路由器,但TestView.js不是?
这里是app.js的第一线
define(['router'],function (Router) {
这里是TestView.js的第一线
define(['backbone','router'],function(Backbone,Router){
检查出完整的详细信息,下载回购,运行和检查控制台日志,如果你觉得这样的倾向
谢谢! 吉姆
更多:好了,答案是 - 因为为了在其中加载和即使被涂改我有一个循环依赖不是吗? TestView需要路由器,路由器需要TestView。
在这种情况下,解决方案可能是
var r=require('router);
r.navigate or whatever
但是,这似乎是一个耻辱,路由器是不能直接访问无处不在,是上述方法中好的做法呢?
当然这是因为循环依赖的。 要解决它,你要么通过路由器视图的构造函数和视图的模块去掉路由器的依赖,或使用要求(“路由器”)在您的视图。
第一种选择,router.js:
app_router.on('route:test', function () {
var testView = new TestView({router: app_router});
testView.render();
})
第一种选择,view.js:
define(['backbone'], function(Backbone){
var TestView=Backbone.View.extend({
el: '#test',
initialize: function() {
// get router from constructior options
this.router = this.options.router
},
render: function(){
this.$el.html('<p>Foo!</p>');
console.log("TestView.js does not find 'Router',", this.router);
}
});
return TestView;
});
第二个选项,view.js:
define(['backbone','router'], function(Backbone, router){
// at this point router module is not loaded yet so router is undefined
var TestView=Backbone.View.extend({
el: '#test',
initialize: function() {
// at this point router module is loaded and you may access it with require call
this.router = require('router');
},
render: function(){
this.$el.html('<p>Foo!</p>');
console.log("TestView.js does not find 'Router',", this.router);
}
});
return TestView;
});
第二个选项也是在这里描述: http://requirejs.org/docs/api.html#circular
你应该定义baseUrl
在您的财产main.js
包含RequireJS配置文件。 这样在你的应用程序模块的所有路径将是相对于baseUrl
。
看到:
http://requirejs.org/docs/api.html#jsfiles
http://requirejs.org/docs/api.html#config-baseUrl
我下载并检查你的代码。 以下可能是问题:
require.js
只适用于AMDs
。 由于骨干不再支持AMD
。 您将需要使用AMD
的启用版本Backbone
。 你可以得到它在这里
TestView是你路由器的依赖。 所以路由器加载之前加载。
你可能想提高编码模式。 这里是我的建议:
App.js
define([
'主干', '路由器',],函数(骨架,MainRouter){ '使用严格';
var AppView = Backbone.View.extend({
initialize: function(){
App.router = new MainRouter();
Backbone.history.start();
}
});
return AppView;
});
Router.js
define([
'backbone',
'view/TestView'
], function(Backbone, TestView){
var Main = Backbone.Router.extend({
routes: {
'test': 'test'
},
test: function(){
new TestView({
// pass model or collection to the view
// model: new TestModel // remember to require
});
}
});
return Main;
});
编辑监听事件:
// in main.js
var window.Vent = {};
_.extend(window.Vent, Backbone.Events);
// now in any view you can trigger a event
$('something').on('click', function(){
window.Vent.trigger('somethinghappened', this);
// this is reference to current object
});
// now in other view you can do
window.Vent.on('somethinghappened', this.run, this);
// this in the end is the reference we passed when event was triggered
run: function(obj){
//this function will run when the event is triggered
// obj is the object who triggered the event
}
PS:你为什么要在视图中使用的路由器? 我已经建立了不少主干应用程序。 从来不需要这么做。
您可以使用现有Backbone.history.navigate
来实现自己的目标更容易,因为Router.navigate
是它的一个简单的包装。 考虑这个骨干源的一部分 :
navigate: function(fragment, options) {
Backbone.history.navigate(fragment, options);
return this;
},