集合和模型之间的Backbone.js和localStorage插件关系 - 基于官方'todo'示例

Jan*_*ray 1 javascript backbone.js

这是官方示例应用:

http://documentcloud.github.com/backbone/docs/todos.html

我对集合与其属性之间的关系感到困惑 localStorage = new Store(..)

不应该这样,model因为你collection.save()无论如何都做不到?

另外,我尝试实现类似的东西,但它不起作用

var Person = Backbone.Model.extend({
        defaults: {
            name:'no-name',
            age:0
        }
});


var Persons = Backbone.Collection.extend({
        model: Person,
        localStorage: new Store('Persons'),
        initialize: function(){
            console.log('collection initialized');

        }
});

window.people = new Persons();

var p1 = new Person({name:'JC',age:24});
p1.save({text:'hello'}); //<--- Uncaught TypeError: Cannot read property 'localStorage' of undefined
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?

Jan*_*ray 6

它实际上.create()是一个集合的功能,允许集合"保存"到localStorage.

todo样本的源代码:

createOnEnter: function(e) {
      var text = this.input.val();
      if (!text || e.keyCode != 13) return;
      Todos.create({text: text});
      this.input.val('');
    },
Run Code Online (Sandbox Code Playgroud)

然后,这允许模型实例使用该.save({attr:value})函数对其进行操作.

在模型的构造函数中调用modelInstance.save() 没有已定义localStorage属性将导致错误:

Uncaught TypeError: Cannot read property 'localStorage' of undefined

但是,由于模型现在通过该collectionInstance.create()方法保存在localStorage中,modelInstance.save({attr:value})现在可以用来修改它.

因此,总之,Models只具有save()允许持久性的功能,但Collection对象具有create()允许持久性的功能.

为了使用它们,必须正确设置集合和模型中的REST URL,或者必须在构造函数中实例化localStorage插件(取决于设置)