0

これをできるだけ簡潔に説明しようと思います。私が取り組んでいるアプリ内では、バックボーン モデルが保存され、後で編集することができます。現在、機能が完全に動的な場所にセットアップしています。

例:this.model.set('attribute', value)

標準的なものがあります。これが問題です。クライアントは、ユーザーが保存して終了ボタンを明示的にクリックするまで、更新されたモデルを保存しないことを望んでいます。

以前は、次のパターンを編集に使用していました。

this.model = options.previousModel || new NamedBackboneModel({
    id: this.model.get('id'),
    attr: otherModel.get('attr')
});

その例のプロパティとモデル名を一般的なものにしましたが、うまく機能しました。ビュー全体で使用model.set('attr' value)し、完璧でした。

以前のモデルにすぐに保存せずに、previousModel を編集できる最善の方法は何ですか?

バニラ オブジェクトを使用して変更を追跡することを検討しましたが、典型的なバックボーン パターンによりインライン化された、より良い方法が必要であると考えています。

当然、試してみnew NamedBackboneModel(options.previousModel.toJSON())ましたが、モデルのネストされたコレクションが期待どおりに機能せず、アーキテクチャの変更が必要になるためです。

以前のモデルのクローンが機能すると考えましたが、そのアプローチでもうまくいきませんでした。ご協力いただきありがとうございます。さらに説明が必要な場合はお知らせください。

4

2 に答える 2

1

{silent: true}呼んだらパスするべきだと思いますmodel.set()

次に、呼び出しmodel.previousAttributes()て以前のすべての属性を取得することにより、以前の値のリストを取得できます。またはmodel.previous("name")特定の属性を取得します。

以前の属性を破棄したい場合は、model.change()「変更」イベントを呼び出すために呼び出すことができます。

保存したい場合はmodel.save({silent:false})、以前の属性を保存して破棄するか、または渡すことで{silent:true}以前の変更を保持できます。

于 2013-02-12T14:00:43.727 に答える
0

私はこれを機能させるために方法の組み合わせを使用することになりました。次のようにモデルに保存機能と復元機能を追加しました。

store: function() {
    this._storedAttributes = _.clone(this.attributes);
    this._storedCollection = _.clone(this.collection().toJSON());
},

revert: function() {
    if (this._storedAttributes) {
        this.set(this._storedAttributes, {
            silent: true
        });
        this.collection.remove(this.collection.models, { silent: true });
        this.collection.reset(this._storedCollection, { silent: true });

        // For syncing local storage up the chain
        if(!this.isNew()) { this.trigger('change'); }
    }
},
于 2013-02-12T19:18:20.377 に答える