2012-06-29 40 views
0

我已经配置了requirejs来加载核心库(jQuery,下划线,主干)。 现在我想添加我的骨干模型,控制器,视图等异步加载Requirejs2:如何处理自己的文件?

我发现了很多教程这个主题和很多“准备好”样板不幸我提到,大多数方法是depreceated或相当复杂(即使有更好的方法)。

一个例子是我如何配置的主库requirejs: https://stackoverflow.com/a/10914666/1309847

因此,我怎么加载骨干意见,型号,类别,路由器,控制器和模板,用一简单和有效的Requirejs配置?

我跟着您选择的建议,但得到一些奇怪的错误

main.js

require.config({ 
    paths: { 
     jquery: 'vendors/jquery/jquery', 
     underscore: 'vendors/underscore/underscore', 
     backbone: 'vendors/backbone/backbone' 
    }, 
    shim: { 
     underscore: { 
      exports: '_' 
     }, 
     backbone: { 
      deps: ['underscore', 'jquery'], 
      exports: 'Backbone' 
     } 
    } 
}); 

require(['app'], function(app){ 

}); 

app.js

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone){ 
    var Message = new Backbone.Model.extend({ 
     //idAttribute: '_id', 
     //defaults: { body: '' } 
     //url: function(){ return this.id ? '/messages/' + this.id : '/messages'; } 
    }); 

    var newMessage = new Message({ body: 'hi' }); 
    newMessage.save(); 
}); 

在app.js错误occours:

Uncaught TypeError: Object [object Object] has no method 'apply' 

当我评论新的Backbone.Model.extend部分时,我不再有任何错误。

+1

似乎加载下划线或主干网时出现问题。在app.js的第二行放置一个断点,并检查“_”或“Backbone”是否未定义。在这种情况下,请检查您的路径,以及libs版本寻求兼容性问题。如果一切都失败了,请尝试使用AMD骨干版本和undercore:https://github.com/amdjs – eabait

+0

我做了一个console.log三个参数。所有三个看起来有效,但我已经指定了更多的错误。它发生在我想创建一个新的Message实例时。 (我也可以取消注释模式,但实例化会给出错误) –

+1

好的,删除此行中的“new”“var Message = new Backbone.Model.extend”。它应该是var Message = Backbone.Model.extend – eabait

回答

1

根据我的经验,引导您的应用程序的最佳方式是创建一个Backbone.Router。因此,您可以将网址与您的应用程序功能相关联。 如果你使用的是RequireJS + Backbone,你可能有一个main.js配置RequireJS(路径,垫片等)。第一次调用“require”用于加载初始脚本以引导整个应用程序。 例如:

/** 
* main.js - RequireJS bootstrap 
*/ 
require.config({ 
    paths: { 
    //your paths 
    }, 
    shim: { 
    //your shims 
    } 
}); 

require(
    [ 
    'app' //app.js is at the same directory as main.js 
    ], 
    function(app) { 
    app.init(); 
    } 
); 

然后在app.js你可以创建一个新的路由器的实例,或者你可以开始创建视图和模型。

有待进一步参考:http://addyosmani.github.com/backbone-fundamentals/

+0

谢谢你的例子!在学习骨干网时,我试图首先遵循你的建议,使用app.js和视图,模型,集合等。但是这给了一些奇怪的错误。我编辑了开始线程 –

0

因此,我现在明白了:你必须在你自己的自定义js文件中包装一个requirejs函数。

该函数被称为define。第一个参数是您在main.js文件中定义的依赖关系的数组,或者是您的另一个自定义js的相对路径。 第二个参数是保存原始文件的回调。重要的是你返回你想要共享的对象,函数,数组或变量。

整个事情是这样的:

define(
    ['underscore', 'backbone'], // the dependencies (either relative paths or shortcuts defined in main.js 
    function(_, Backbone){ // the return statement of the deps mapped to a var 
     var MessageModel = Backbone.Model.extend({ // the original code, file 
      defaults: { body: '' }, 

      initialize: function(){} 
     }); 

     return MessageModel; // the return statement, sharing the "final result", sometimes you return the initialize parameter 
    }); 

同为一家集包装型号:

define(
    ['jquery', 'underscore', 'backbone', 'models/message_model'], // deps and the last one is the relative path 
    function($, _, Backbone,MessageModel){ // same as above explained 
var MessageCollection = Backbone.Collection.extend({ 
    model: MessageModel, 

    initialize: function(){} 
}); 

return MessageCollection; 

});

我现在只需要弄清楚我如何可以引导到整个应用程序。但我认为我需要更多的骨干知识来做到这一点:)

相关问题