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并且一切正常.
| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |