Backbone同步覆盖中的“读取”收集逻辑

时间:2014-02-03 10:56:03

标签: javascript backbone.js backbone-collections

在重写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的存在就足以区分ModelCollection,以便在find()和{之间切换{1}}。

我在这里错过了什么吗?这是一个权威资源。

2 个答案:

答案 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
  }
}