Model view controller Backbone.js:如何在对象文本中对集合调用方法

Model view controller Backbone.js:如何在对象文本中对集合调用方法,model-view-controller,coding-style,backbone.js,underscore.js,object-literal,Model View Controller,Coding Style,Backbone.js,Underscore.js,Object Literal,我有以下backbone.js代码。我使用一个对象文本来组织代码,这给我留下了一个关于最佳方式的问题。该应用程序(以下面的简化形式)有一个控制面板(可以显示或隐藏),用于向集合添加新类别。(问题如下) 显然,上面提到的问题是,调用addCategory函数试图调用未初始化对象上的函数。我已经解决了这个问题(请参阅注释掉的代码),方法是在init函数中实例化的对象上调用函数。我的问题是——这是正确的做法吗?我闻到一股密码的味道。我觉得object literal的内容不应该依赖于所创建的对象才有效

我有以下backbone.js代码。我使用一个对象文本来组织代码,这给我留下了一个关于最佳方式的问题。该应用程序(以下面的简化形式)有一个控制面板(可以显示或隐藏),用于向集合添加新类别。(问题如下)

显然,上面提到的问题是,调用addCategory函数试图调用未初始化对象上的函数。我已经解决了这个问题(请参阅注释掉的代码),方法是在init函数中实例化的对象上调用函数。我的问题是——这是正确的做法吗?我闻到一股密码的味道。我觉得object literal的内容不应该依赖于所创建的对象才有效。除非先在父对象上调用init函数,否则此实例中的函数addCategory将无法工作这里有没有其他我应该使用的模式?

否则,我将如何将“createnewcategory表单”的内容传递到集合以便添加(我使用create是因为我想自动验证/创建/持久化模型,这似乎是最容易做到的事情)。我是一个骨瘦如柴的新手(这是我的“你好世界”)


谢谢

我认为主要的问题是您将
类别集合
视为一个对象。它实际上不是一个对象,而是一个构造函数。因此,首先您需要创建一个实例,正如您所发现的那样

然后,
addCategoryView
需要某种引用实例的方式。看起来您没有与视图关联的模型。我建议创建一个模型,并将
categoryCollection
实例存储为模型的属性。类似这样的内容(警告,未测试的代码):

var model=新主干网。model({
类别:new categoryManager.app.CategoryCollection()
});
var view=new categoryManager.app.AddCategoryView({
el:$(“#添加新类别”),
型号:型号
});
然后您可以从内部
addCategoryView
使用
this.model.categories


另外,一个常见的Javascript约定是将构造函数的名称大写。调用构造函数CategoryCollection可能会使代码更加清晰。

在创建模型的新实例之前,需要初始化集合

addCategory: function() {
    var collection = categoryManager.app.categoryCollection;

    !collection.create && (collection = new collection);
    collection.create({
        name: $('#name').val()
    });
}

我的理解是,集合包含模型,而不是相反的模型。模型包含一个本身包含模型的集合(如我的集合所做的那样)可以吗(不是“will work”中的OK,而是“the right thing to do”中的OK)?感谢您的输入。我认为这很好,并且有助于封装-MVC类型体系结构的一般思想是,模型包含视图自身呈现所需的所有数据。谢谢-您会看到我在这方面获得了奖励,所以我将继续打开它,看看是否能得到更多的答案。我无法让你的代码工作(第一行),所以我改为这样做。AddViewModel:Backbone.Model.extend({initialize:function(){this.categories=new categoryManager.app.CategoryCollection;},categories:null})。如果我省略了初始化函数,它将失败-我无法直接将构造函数分配给“categories”属性。示例代码不太正确-希望现在更好没有-如果我尝试直接初始化集合,我会出现以下错误。”categoryManager.app未定义“”。如果我在模型的initialise方法中初始化集合,那么它将按预期工作。Hi。我已经知道了(请参阅我代码中注释掉的行)。示例中第三行代码的用途是什么?
!集合。创建
检查
集合
是否未初始化,如果未初始化,则初始化集合并将其分配给
集合
变量
!collection.create&(collection=新集合)等于(!collection.create){collection=new collection}
addCategory: function() {
    var collection = categoryManager.app.categoryCollection;

    !collection.create && (collection = new collection);
    collection.create({
        name: $('#name').val()
    });
}