2

Spine.js には慣れていますが、Backbone.js を試してみたいと思っています。

Spine にはコレクションはありません。モデルしかありません。Spine では、異なる場所でモデルを使用する場合、Spine はモデルを更新するときに常にモデルを相互に同期させます。Backbone では、そうではないことがわかりました。私が間違っていることを教えていただければ幸いです。

内部に 3 つの Article モデルを持つ 2 つの Articles コレクションを作成しようとしています。

var Article = Backbone.Model.extend({});

var Articles = Backbone.Collection.extend({
  model: Article,
  localStorage: new Backbone.LocalStorage("Articles")
});

var articles1 = new Articles();
var articles2 = new Articles();

articles1.create({ id: 1, name: "Article 1" });
articles1.create({ id: 2, name: "Article 2" });
articles1.create({ id: 3, name: "Article 3" });

Chrome では、コンソールを使用して少し実験します。

articles1.size()
=> 3
articles2.size()
=> 0
articles2.fetch()
=> undefined
articles2.size()
=> 3

ここまでは順調ですね。両方のコレクションの最初の記事は「記事 1」です。

a1 = articles1.first()
=> child
a2 = articles2.first()
=> child
a1.get("name")
=> "Article 1"
a2.get("name")
=> "Article 1"

しかし、最初のコレクションのモデルを更新しようとすると、2 番目のコレクションと同期されません。

a1.set({ name: "Article 1 - Updated" })
=> child
a1.save()
=> undefined
a1.get("name")
=> "Article 1 - Updated"
a2.get("name")
=> "Article 1"

2 番目のコレクションのモデルが自動的に更新されることを期待していました。

しかし、両方の記事モデルの cid が異なることがわかります。

a1.cid
=> "c0"
a2.cid
=> "c3"

私の質問は... Backbone で何をしているのですか? コレクション間でモデルをどのように同期させますか?

私は実際にこのブログ記事を読みました: http://destroytoday.com/blog/reasons-for-spinejs/ . 彼は書く:

動的レコード

これは単なるクレイジーな黒魔術ですが、私が Backbone.js で直面した問題を解決してくれます。アプリの 1 つのビューでレコードを取得したとします。次に、別のビューで同じレコードをフェッチして更新します。Spine.js では、両方のレコードが更新されます。それらの同期を維持することについて心配する必要はありません。これを読んだ瞬間、一筋の涙が頬を伝いました。

私は本当にこれについて検索しようとしましたが、運がありませんでした。

これをバックボーンの方法で行う方法について、正しい方向に向けていただければ幸いです。

4

1 に答える 1

3

2 つの基本的なオプションがあります。

  1. 両方のコレクションに、モデルのまったく同じインスタンスへの参照が含まれていることを確認してください。同じ ID を持つ 2 つのオブジェクトだけでなく、実際にはそのレコードの同じメモリ内単一モデル インスタンスです。

  2. イベント バインディングを使用して、コレクションまたはコレクション内のモデルの同期を維持しようとします (コレクション 1 で追加/削除/変更/リセットすると、コレクション 2 で追加/削除/変更/リセットが発生します)。

スパインの動作が必要な場合は、#1 を機能させます。ここで説明されているように、おそらくインスタンス キャッシュを使用します。

于 2012-09-18T22:50:05.750 に答える