0

コレクションに項目を追加しようとしていますが、最初に既存の項目を削除したいと考えています。存在するアイテムは 1 つだけです。新しいものを作成できますが、削除することはできません。ひょっとしたら逆にやっているのかもしれません。

これは私のコレクションです。changetheme は呼び出される関数であり、機能しますが、既存のものを削除する方法がわかりません。this.model.destroy() はエラーをスローするだけです。多分私は文脈から外れています。

bb.model.Settings = Backbone.Collection.extend(_.extend({
    model:  bb.model.Setting,
    localStorage: new Store("rrr"),

    initialize: function() {
        var self = this
        this.model.bind('add', this.added, this);
    },
    changetheme: function(value) {
        var self = this
        this.destroy();
        this.create({theme:value});
    },
}));

それが問題なら、これは私のモデルです

bb.model.Setting = Backbone.Model.extend(_.extend({
    defaults: {
        theme: 'e'
    },
    initialize: function() {
        var self = this;
    },
    added: function(item) {
        var self = this;
        this.destroy(); 
    },
}));
4

1 に答える 1

1

を呼び出すことができるコレクションから最初のアイテムを削除するにはcollection.shift()、 を呼び出してコレクションをクリアすることもできますcollection.reset()。したがって、あなたの場合、次のように書くことができます:

changetheme: function(value) {
    this.shift();
    this.create({theme:value});
}

UPD わかり ました、説明させてください-あなたの例では、 localStorage は他のサーバー側と同じように機能します。したがって、「 create 」を呼び出すと、 docsバックボーンに従って、属性のハッシュを使用してモデルをインスタンス化し、それをサーバー (localStorage) に保存し、正常に作成された後にセットに追加します。そのため、ページを更新するたびにコレクション アイテムの数が増えます。ただし、 shift/remove docsを呼び出すと、クライアント側のコレクションのみが影響を受け、サーバー (localStorage) のコレクションは影響を受けません。サーバーとクライアントの両方からモデルを削除するための最良のオプションは、次のようにモデルの destroy メソッドを呼び出すことです。

changetheme: function(value) {
    var modelToDelete = this.at(0) //take first model
    modelToDelete.destroy();
    this.create({theme:value});
}
于 2012-10-31T09:37:32.827 に答える