Require.js模块没有看到骨干Router.js(Require.js module not

2019-09-01 13:14发布

在这个简单的要求/骨干网应用

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

但是,这似乎是一个耻辱,路由器是不能直接访问无处不在,是上述方法中好的做法呢?

Answer 1:

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

第一种选择,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



Answer 2:

你应该定义baseUrl在您的财产main.js包含RequireJS配置文件。 这样在你的应用程序模块的所有路径将是相对于baseUrl

看到:

http://requirejs.org/docs/api.html#jsfiles
http://requirejs.org/docs/api.html#config-baseUrl



Answer 3:

我下载并检查你的代码。 以下可能是问题:

  1. require.js只适用于AMDs 。 由于骨干不再支持AMD 。 您将需要使用AMD的启用版本Backbone 。 你可以得到它在这里

  2. 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:你为什么要在视图中使用的路由器? 我已经建立了不少主干应用程序。 从来不需要这么做。



Answer 4:

您可以使用现有Backbone.history.navigate来实现自己的目标更容易,因为Router.navigate是它的一个简单的包装。 考虑这个骨干源的一部分 :

navigate: function(fragment, options) {
  Backbone.history.navigate(fragment, options);
  return this;
},


文章来源: Require.js module not seeing Backbone Router.js