0

我有一个代码:

Application = function() {
    Application.prototype.currentQuote.collection.fetch();
};

Application.prototype = {}

Application.prototype.currentQuote = {};
Application.prototype.currentQuote.model = new (Backbone.Model.extend({
    defaults: {
        products: []
    }
}))();

Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.model,
    url: 'test.json'
}))();

App = new Application();

但是,当获取集合时,我得到“未捕获的类型错误:对象不是函数”错误。我不明白为什么,我能解决什么?

您可以在此处查看测试用例:https ://dl.dropbox.com/u/15806777/development/bb/index.html

谢谢!

4

2 回答 2

3

我猜你的问题就在这里:

Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.model, // <------------------------
    url: 'test.json'
}))();

一个集合model是:

集合包含的模型类。

所以model应该是来自Backbone.Model.extend({...})(即“类”)的东西,而不是来自new (Backbone.Model.extend({...}))(即模型实例)的东西。当您要求一个集合创建一些模型时(通过构造函数调用,fetch... add),该集合需要它可以使用new的东西,而您不能new model_instance,因为new操作员需要一个构造函数

new运算符创建用户定义对象类型或具有构造函数的内置对象类型之一的实例。

这就是您的“未捕获类型错误:对象不是函数”错误的来源。

你需要这样的东西:

Application.prototype.currentQuote.Model = Backbone.Model.extend({
    defaults: {
        products: []
    }
});
//...
Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.Model,
    url: 'test.json'
}))();
于 2012-07-07T16:47:01.950 回答
2

这种架构非常奇特。目前尚不清楚您要达到的目标。我建议阅读一下函数原型的工作原理。但更有可能的是,您的意图更像是这样:

(function () {
  var CurrentQuote, CurrentQuoteSet;

  function Application() {
    this.collection = new CurrentQuoteSet;
    this.collection.fetch();
  };

  CurrentQuote = Backbone.Model.extend({
    defaults: {
      products: []
    }
  });

  CurrentQuoteSet = Backbone.Collection.extend({
    model: CurrentQuote,

    url: "test.json"
  });

  window.App = new Application;
})();
于 2012-07-07T13:19:34.480 回答