Backbone.js错误:必须指定'url'属性或函数

Bil*_*ill 9 javascript backbone.js

这实际上是一个答案而不是一个问题.大量使用backbone.js.遇到一个讨厌的小动物,但没有在网上找到我的特定案例的解释.希望这会节省别人一些时间.

症状

调用取()在骨干错误从集合结果拉到模式:"一个'url’属性或功能必须指定",即使这两个收集和模型覆盖同步().

娱乐

AppPax.People = Backbone.Collection.extend({
    ...
    model: AppPax.Person,
    ...
});

...
AppPax.Person = AppPax.Model.extend({
    ...
    sync: function(method, model, options) {

        var response;

        switch (method) {
            case "read":    response = AppPax.getPerson(this.get("party_id"));
                            break;
        ...
    },
    ...
});

var c = new AppPax.People();
c.fetch();
var person = c.find(function(person){
    return(person.get("party_id") == "5");
});
// everything seemingly successful up to here (but not really)
person.fetch();
Run Code Online (Sandbox Code Playgroud)

产生的主干错误:必须指定"'url'属性或函数"

错误的调查

所以在经过一些调试和调查之后,包括查看backbone.js代码,显然Backbone正在寻找Person模型上的url属性而无法找到它.但是,我的Person模型会覆盖sync(),当模型覆盖sync()时,Backbone不要求模型提供url属性/方法.

我也注意到了一个异常现象:集合中的模型从未实例化过.

基于完全相同模式的所有其他东西已经很好地工作了很长时间.

该怎么办?

根本原因

根本原因竟然是在我的模块定义(AppPax)我已经把人的定义人的定义之后(由于我的订货代码按字母顺序排列的现在已经不那么有用的习惯).

当Backbone根据我的请求创建了People的实例时,它显然不了解AppPax.Person所以它根据c.fetch()返回的模型属性创建了自己的Person版本 - 没有我所有的好东西,包括我的sync()方法.

所以,当我尝试做person.fetch()时,它使用了它自己的,极简主义的Person定义而不是我的,并且该定义没有sync()方法,所以它在Person上找了一个url属性/方法,没找到它...哽咽.

所以我在AppPax.People之前定义了AppPax.Person并且一切正常.