Backbone.js:将视图,集合,模型分离到不同的js文件,它们无法识别对方
我使用Backbone.js创建一个Web应用程序,将所有视图,集合和模型写入一个js文件,它成功了!
现在我想将它们分成不同的js文件,就像:
并在jquery load中加载模型代码:
$(function(){ //Model var manageModel = Backbone.Model.extend({ default:{ 'selectedId':'unknow' }, selectLayer:function(uuid){ this.set({"selectedId": uuid}); }, delLayer:function(){ } }); })
萤火虫告诉我bug:
manageModel is not defined [Break On This Error] model: manageModel
在集合文件中
为什么如果将它们分成不同的文件,它们无法识别对方?我怎样才能解决这个问题?或者什么是正确的加载顺序?谢谢
添加函数包装器后:
$(function() { // ... })
您已经引入了新的作用域,并且在这些函数中声明的所有var
仅在这些函数中可见。 你可以通过使它们全局(即window
属性)来解决这个问题:
$(function(){ window.manageModel = Backbone.Model.extend({ //... }); });
或者更好,引入应用程序命名空间:
$(function(){ window.app = window.app || { }; window.app.manageModel = Backbone.Model.extend({ //... }); });
然后通过app.manageModel
app
引用事物:
$(function(){ window.app = window.app || { }; window.app.someCollection = Backbone.Collection.extend({ model: app.manageModel, //... }); });
您还可以使用Require.js查看使用js文件模块化。 工作得非常好,只会在需要时加载视图,模型和集合。 如果您的应用程序非常大,建议使用此方法。 它将阻止您在页面加载时加载所有脚本。 一个快速的backbone.js实现如下:
define([ 'jquery', 'underscore', 'backbone', 'models/post' ], function ($, _, Backbone, Post) { "use strict"; var PostsCollection = Backbone.Collection.extend({ model: Post, url: CONFIG.apiUrl + 'posts' }); return PostsCollection; });
以上是收集模块。 你可以看到’models / post’指向另一个模块的位置。 jquery,下划线和主干在我的配置中定义,所以我只需要传入它们而不是指向它们的实际位置。 这是一个快速介绍,但是如果你想分开你的js文件, 那就是Require.js 。