Backbone.js模型:类型数组的属性维护实例之间的数据

时间:2013-10-22 09:48:35

标签: arrays backbone.js coffeescript

假设我有以下Backbone.js模型:

    class App.Models.Article extends Backbone.Model
      defaluts:
        id: ''
        name: ''
        tags: []

以及显示其内容的视图。在主视图中,我通过将新创建的文章传递为:

来创建文章视图的实例
    v = new App.Views.ArticleView({ model: new App.Models.Article() })

并将其呈现给页面。

在文章视图和用户交互中,通过以下代码将一些标签添加到标签数组中:

    addTag: ->        
      tags = @model.get('tags')
      tags.push({id: '', name: 'foo'})
      tags.push({id: '', name: 'bar'})

到目前为止一切顺利!然后我关闭文章视图并渲染另一个视图。后来我想再次渲染文章视图,所以代码:

     v = new App.Views.ArticleView({ model: new App.Models.Article() })

再次跑。

问题出在渲染之后,我仍然可以看到以前在tags数组中输入的标签,即如果在文章视图中,我写道:

     console.log(@model.get('tags'))

它将输出之前添加的两个对象。我希望每个实例在创建时都有其默认值,而不是没有更多引用的实例。有任何想法吗?有关Coffescript的任何问题吗?

P.S。我希望问题陈述足够清楚:)

2 个答案:

答案 0 :(得分:0)

不要在默认情况下使用数组和对象,它们将在模型实例之间共享。如果您希望标签为空数组,请在初始化函数中添加。

var MyModel =  Backbone.Model.extend({
    initialize:function(){
        this.set('tags', [])
    }
})

答案 1 :(得分:0)

解决!

问题是Coffeescript将默认值附加到原型,因此定义默认值如下解决了问题:

    defaults: ->
      id: ''
      name: ''
      tags: []

它再次附加到原型上,但作为一个函数,它为每个调用返回一个空对象。