在重写Backbone.sync的the O'Reilly 'Developing backbone.js applications'示例中,运行示例findAll()
vs find()
方法有以下逻辑:
case 'read':
if (model.attributes[model.idAttribute]) {
return MyAPI.find(model, success, error);
} else {
return MyAPI.findAll(model, success, error);
}
}
在fetch()
上运行Collection
会导致以下错误:model.idAttribute is undefined
这是因为参数model
在调用myCollection.fetch()
时包含一个集合。所以它不包含idAttribute
。
在我看来,仅仅测试model.idAttribute
的存在就足以区分Model
和Collection
,以便在find()
和{之间切换{1}}。
我在这里错过了什么吗?这是一个权威资源。
答案 0 :(得分:1)
代码修复应该类似于
case 'read':
if (model.idAttribute) {
if (model.attributes[model.idAttribute]) {
return MyAPI.find(model, success, error);
}
} else {
return MyAPI.findAll(model, success, error);
}
您需要对两者进行测试,因为模型可能使用idAttribute
值定义哪个属性是id,但实际的id值可能不存在。换句话说,如果您收到的模型实例是
{
idAttribute: "myId",
name: "test"
}
您无法调用find
方法,因为您必须在查询中使用id值(即myModel.get("myId")
不会返回任何内容)。
答案 1 :(得分:1)
您可以尝试instanceof
:
case 'read':
if (model instanceof Backbone.Model && model.idAttribute) {
return MyAPI.find(model, success, error);
} else if (model instanceof Backbone.Collection) {
return MyAPI.findAll(model, success, error);
} else {
// the model have no idAttribute
}
}