为了学习 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);
});
在您的示例中,您使用了一个承诺将对象添加到控制器。在这个代码示例中,promise 永远不会实现——因此它只能在没有的情况下工作。
另外在LabelController
remove方法中也应该删除关联的链接。如果我deleteRecord
在 forEach 循环中使用它只会删除一个标签,然后它会以某种方式使循环退出。这是故意的还是我犯了错误?
我已经更新了你的 JsBin。
http://jsbin.com/ucanam/1987/edit