Ember.js を学ぶために、小さなブックマーク アプリケーションを書き始めました。現在、間違ったデータ処理に関連する問題に苦しんでいます。
アプリケーションを説明するには
- ユーザーはラベルを追加できます
- ユーザーは選択したラベルにリンクを追加できます
- ラベルは n 個のリンクを持つことができます
- リンクは n 個のラベルを持つことができます
- 関連するラベルを選択してリンクを表示
問題
リンク データはデータ ストアに書き込まれません。このため、選択の変更によるリンク モデルへのローカル更新は上書きされます。また、真の持続性を後で実装してもうまくいきません。
問題の絞り込み
IndexRoute で、モデルを初期化します。
model: function(params) {
return {
labels: this.get("store").find("label"),
// TODO: this is probably wrong.
links: Ember.A()
};
}
一方では、データ ストアからラベル データをフェッチします。反対側では、リンク データを空の ember 配列で初期化します。
私の意見では、これが誤動作の原因ですが、これを適切に実装する方法がわかりません。これをストレージアダプターへの偽の参照に置き換えようとしました:
this.get("store").find("label").filter("_")
これは正しくなく、適切に機能しません。その後、ストレージ アダプターを使用してレコードを更新できなくなるところまで続きます。
// TODO: this is probably wrong.
this.get("links").addObject({
name: linkName,
url: linkUrl,
labels: this.selectedLabels
});
/*store.push("link", {
name: newLink,
url: linkUrl,
labels: this.selectedLabels
});*/
等々。
Jsbin: http://jsbin.com/ucanam/1751/edit
コントローラーのローカルデータを変更してもアプリケーションが壊れないように、リンクデータを適切に保存する方法は?
編集:
あなたのアドバイスで私の概念的な間違いを見つけたと思います。これは、常にローカル コピーも処理する必要があるということですか?
var link = this.get("model");
link.deleteRecord();
link.save().then(function(link) {
var indexController = this.get('controllers.index');
indexController.get("links").removeObject(link);
});
あなたの例では、プロミスを使用してオブジェクトをコントローラーに追加しました。このコード サンプルでは、約束が果たされることはありません。したがって、約束がない場合にのみ機能します。
またLabelController
、remove メソッドでは、関連付けられたリンクも削除する必要があります。deleteRecord
forEach ループで使用すると、ラベルが 1 つだけ削除され、何らかの形でループが終了します。これは意図的なものですか、それとも私がミスをしたのでしょうか?
JsBin を更新しました。
http://jsbin.com/ucanam/1987/edit