Backbone.js中的命名空间

时间:2012-09-03 03:51:46

标签: javascript jquery backbone.js namespaces underscore.js

我很困惑如何在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 });

3 个答案:

答案 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)

  1. 在JS中使用命名空间被认为是最佳做法,请继续这样做。
  2. 正如所说,使用辅助函数而不是'手动'命名空间,如果更好的话。我使用的命名空间函数,如果here
  3. App = App || {}; - 执行以下操作。如果App未定义(未初始化,第一次使用)||运算符返回false因此,应用了第二个语句,并使用空对象初始化App变量。