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

时间:2012-03-07 03:15:04

标签: 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

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

2 个答案:

答案 0 :(得分:6)

实际上,集合的.create()函数允许集合“保存”到localStorage。

source-code of todo sample:

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

然后,这允许模型实例使用.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插件(取决于设置)

答案 1 :(得分:-1)

我遇到了类似的问题,我想简单地“保存”我从LocalStorage加载的一个集合。我在我的集​​合上编写了一个save()方法,它只是循环遍历每个模型并调用了model.save()。

MyCollection.save = ->
    @each (model) ->
        model.save()

然而,关于Backbone.LocalStorage,这有一个很大的缺点。你失去了使用Collection.set({models ...})的所有好处;使用所有添加/合并/删除优点更新您的收藏(提取在线更新或其他内容)。在运行时从集合中删除模型不会将其从本地存储中删除,并且手动识别不匹配的模型并在某种程度上销毁它们会使Backbone.Collection.set()的目的失效;

我发现的一个解决方案是扩充Backbone,使Backbone.Collection.set()在它发现缺失的模型上使用destroy()而不是remove()。 (见BB 1.0.0第705行)

我接下来的另一个解决方案是让所有模型都听取他们自己的'删除'事件,并在发生时调用他们自己的'destroy'方法。这允许Backbone.Collection.set()的删除成为永久删除。

class Model extends Backbone.Model
  initialize: ->
    @on 'remove', @destroy

这两个意味着你不能永久地“删除”一个模型,这对我来说很好。如果您愿意,您可能会创建一些特殊条件,并以此方式进行管理。