Backbone.js Requirejs2:如何处理自己的文件?
我已经配置了requirejs来加载核心库(jquery、下划线、主干)。 现在,我想添加要异步加载的主干模型、控制器、视图等 我找到了很多关于这个主题的教程和很多“现成”的样板,不幸的是,我提到大多数方法都不受欢迎,或者相当复杂(即使有更好的方法) 一个例子是我如何为主libs配置requirejs: 那么,如何使用简单有效的Requirejs配置加载主干视图、模型、集合、路由器、控制器和模板呢 我听从了你的建议,但出现了一些奇怪的错误 main.jsBackbone.js Requirejs2:如何处理自己的文件?,backbone.js,requirejs,Backbone.js,Requirejs,我已经配置了requirejs来加载核心库(jquery、下划线、主干)。 现在,我想添加要异步加载的主干模型、控制器、视图等 我找到了很多关于这个主题的教程和很多“现成”的样板,不幸的是,我提到大多数方法都不受欢迎,或者相当复杂(即使有更好的方法) 一个例子是我如何为主libs配置requirejs: 那么,如何使用简单有效的Requirejs配置加载主干视图、模型、集合、路由器、控制器和模板呢 我听从了你的建议,但出现了一些奇怪的错误 main.js require.config({
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部分进行注释时,我再也没有收到任何错误。因此,我现在正确地理解了:您必须在自己的自定义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;
}))
我现在只需要弄清楚如何引导到整个应用程序。但我认为我需要更多的主干知识来完成这项工作:)根据我的经验,引导应用程序的最佳方法是创建一个backbone.Router。因此,您可以将URL与应用程序功能相关联。 如果您使用的是RequireJS+主干,那么您可能有一个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中,您可以创建一个新的路由器实例,也可以开始创建视图和模型
进一步参考:谢谢您的示例!在学习主干网时,我尝试先使用app.js和视图、模型、集合等来遵循您的建议。但这会产生一些奇怪的错误。我已编辑开始线程。加载下划线或主干线时似乎出现问题。在app.js的第二行中放置一个断点,并检查“\u1”或“主干”是否未定义。在这种情况下,请检查路径和libs版本以查找兼容性问题。如果一切都失败了,试着使用AMD版本的主干和undercore:我用这三个参数做了一个console.log。这三个看起来都是有效的,但我还指定了一些错误。当我想创建一个新的消息实例时,就会发生这种情况。(我也可以取消对模式的注释,但实例化它会产生错误)好的,删除此行“var Message=new Backbone.Model.extend”中的“new”。它应该是var Message=Backbone.Model.extendt这是:)谢谢你的帮助我永远不会解决阿洛尼诺的问题,我很高兴能帮助你