我很困惑如何在Backbone.js中实现命名空间。我一直在创建我的模特,收藏品和全球观点。命名空间是他们只是在模型,集合和视图类的前面添加App.
&对象和一行window.App = {};
?
它似乎有效,但这被认为是最佳做法吗?如果没有,那会是更好的方法吗?
我也在某处看到App = App || {};
。拥有|| {}
的目的是什么?
尝试命名空间 //命名空间 window.App = {};
// Models
App.Product = Backbone.Model.extend();
// Collections
App.ProductCollection = Backbone.Collection.extend({
model: App.Product,
url: '/wizard'
});
// Views
App.ProductListView = Backbone.View.extend({
el: '#photo_list',
initialize: function() {
this.collection.bind('reset', this.render, this);
},
render: function() {
this.collection.each(function(product, index){
$(this.el).append(new App.ProductView({ model: product }).render().el);
}, this);
return this;
}
});
// Snippet
App.productList = new App.ProductCollection();
App.selectedProductList = new App.SelectedProductCollection();
App.productListView = new App.ProductListView({ collection: App.productList });
答案 0 :(得分:4)
最好使用命名空间函数,该函数将创建或更新命名空间对象,例如: ns('App.Views.Homepage', Backbone.View.extend({...})
。
重新。命名空间约定 - 为了您自己的方便,您可以使用您的文件系统结构。例如,UI/Homepage/View/Main.js
将变为App.UI.Homepage.View.Main
(如果您使用模块,则为{}}。
或者另一种简单的方法是简单易行地找到相关文件 - 基于功能创建结构,例如App.Backbone.Collection.Comments
,您可以从更一般的更具体到更具体,例如你有一个应用程序,一个Backbone,你有视图,模型,集合,路由器。在每个内部,您将拥有特定于您的用例的多个模块。
举个例子,这是我使用的命名空间函数:
var ns = window.ns = function (nspace, payload, context) {
payload = payload || {};
context = context || window;
var parts = nspace.split('.'),
parent = context,
currentPart = '';
while (currentPart = parts.shift()) {
if (parts.length !== 0) {
parent[currentPart] = parent[currentPart] || {};
}
else {
parent[currentPart] = parent[currentPart] || payload;
}
parent = parent[currentPart];
}
return parent;
使用就像我上面提到的那样。
答案 1 :(得分:1)
JavaScript不支持命名空间。您的方法相当于将骨干对象嵌套在全局App对象中。这与您在JavaScript中使用命名空间的距离非常接近。请参阅ahren关于初始化语法的注释。
答案 2 :(得分:1)
App = App || {};
- 执行以下操作。如果App未定义(未初始化,第一次使用)||运算符返回false
因此,应用了第二个语句,并使用空对象初始化App变量。