1

假设我有以下 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() })

再次运行。

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

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

它将输出之前添加的两个对象。我希望每个实例在创建时都有其默认值,而不是不再引用它的东西。有任何想法吗?咖啡脚本有什么问题吗?

PS我希望问题陈述足够清楚:)

4

2 回答 2

0

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

var MyModel =  Backbone.Model.extend({
    initialize:function(){
        this.set('tags', [])
    }
})
于 2013-10-22T10:04:13.157 回答
0

解决了!

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

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

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

于 2013-10-22T11:12:28.457 回答