Backbone忽略idAttribute并设置自己的

时间:2013-08-19 14:33:41

标签: javascript backbone.js coffeescript

我从API创建新模型后,API具有idAttribute ID 。这是我的模特:

class Video extends Backbone.Model
    idAttribute: 'ID'   
    urlRoot: inbox.api.url + "/program"

收集:

class Videos extends Backbone.Collection
    model = Video
    localStorage: new Backbone.LocalStorage 'inbox.video'
    url: inbox.api.url + "/program"

这里我将模型添加到集合中:

_.each data, (o) =>

        model = collection.get o.ID
        if model != undefined
            model.set o
        else
            collection.create o

问题是创建的模型的id不是返回的数据中的ID,因此每次都创建一个模型,因为它在查找o.ID时找不到模型

这是 o 上的其中一个:

ChannelID: "b5f52a36-b154-4232-ace0-4075c384bee1"
ID: "10fa83a6-8508-40a3-a901-a40cad2041da"
LastWriteUTC: "2013/08/19 02:51:14 PM"
Name: "Moments_of_Everyday_Life.mp4"
Publisher: "Marthin"
Size: 1043200

为什么模型的id属性未设置为正确的ID?

谢谢

2 个答案:

答案 0 :(得分:3)

您的问题可能是在评估model = Video时尚未定义。尝试在initialize方法中分配模型

例如

var  Videos = Backbone.Collections.extend({

    localStorage: new Backbone.LocalStorage('inbox.video'),
    url: inbox.api.url + "/program",

    initialize: function () {
      this.model = Video;
    }
})

答案 1 :(得分:0)

这不符合你的想法:

class Videos extends Backbone.Collection
  model = Video

model = Video没有将集合的model属性设置为Video,它只是创建了一个私有类变量。如果您查看生成的JavaScript,您会看到如下内容:

var Videos = (function(_super) {
  var model;
  //...
  model = Video;

  return Videos;

})(Backbone.Collection);

如果您要创建model属性,则会看到:

Video.prototype.model = Video;

代替。因此,model的实例不会有Videos属性,Backbone将使用默认Backbone.ModelidAttribute: 'id'

你可能想这样说:

class Videos extends Backbone.Collection
  model: Video

冒号会得到你期待的Videos::model

查看simple demo

class M extends Backbone.Model

class C1 extends Backbone.Collection
    model = M

class C2 extends Backbone.Collection
    model: M

console.log(C1::model)
console.log(C2::model)

您会看到差异,C1::model将是Backbone.ModelC2::model将是M