Require.js模块没有看到Backbone Router.js

Jim*_*Jim 0 amd requirejs backbone.js

在这个简单的Require/Backbone应用程序中

https://github.com/thisishardcoded/require-prob

为什么app.js看到路由器而不是TestView.js?

这是app.js的第一行

define(['router'],function (Router) {
Run Code Online (Sandbox Code Playgroud)

这是TestView.js的第一行

define(['backbone','router'],function(Backbone,Router){
Run Code Online (Sandbox Code Playgroud)

如果你有这种倾向,请查看repo以获取完整的详细信息,下载,运行并检查控制台日志

谢谢!吉姆

更多:好的,答案是 - 因为它的加载顺序,即使它被改变了,我有一个循环依赖不是吗?TestView需要路由器,路由器需要TestView.

在哪种情况下解决方案可能是

var r=require('router);
r.navigate or whatever
Run Code Online (Sandbox Code Playgroud)

但是,路由器到处都无法直接访问,这似乎是一种耻辱,无论如何,上述方法是不是很好的做法?

And*_*min 5

当然,这是因为循环依赖.要解决它,你要么通过路由器视图的构造函数和视图的模块去掉路由器的依赖,或使用要求("路由器")在您的视图.

第一个选项,router.js:

app_router.on('route:test', function () {
    var testView = new TestView({router: app_router});
    testView.render();
})
Run Code Online (Sandbox Code Playgroud)

第一个选项,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;

});
Run Code Online (Sandbox Code Playgroud)

第二个选项,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;

});
Run Code Online (Sandbox Code Playgroud)

第二个选项也在这里描述:http://requirejs.org/docs/api.html#circular