为了解释我的问题,我编造了一个人为的例子,所以请耐心等待。我有两个相关的 ember 数据模型,每个模型都有相同类型的嵌入式关联:
App.Article = DS.Model.extend({
title: DS.attr("string"),
summary: DS.belongsTo(App.Summary, {embedded: true}),
});
App.Book = DS.Model.extend({
title: DS.attr("string"),
summary: DS.belongsTo(App.Summary, {embedded: true}),
});
App.Summary = DS.Model.extend({
text: DS.attr("string"),
});
ember-data 的一个重要功能是,find()
将返回一个正确类型的对象,即使在从服务器检索实际数据值之前,该对象也可用于呈现视图。但是,我担心这种便利并不能完全扩展到关联。
在这种情况下,当多种类型的对象共享相同类型的关联数据时,我想重用我的视图,该视图显示Book
对象和Article
对象的Summary
对象。我特别想做以下几点:
book: Ember.Route.extend({
route: '/book',
connectOutlets: function(router) {
book = App.Book.find(1);
router.get('applicationController').connectOutlet('titleOutlet', 'book', book);
router.get('applicationController').connectOutlet('summaryOutlet', 'summary', book.get('summary'));
},
}),
也就是说,我希望对特定于书籍的内容有一个视图,对摘要有一个视图,这与显示Book
还是Article
无关。
不幸的是,我不能做book.get('summary')
因为如果这本书没有被store.load()
填充,这将返回null
,Book.find()
异步调用。
另一种选择似乎是遍历 book 对象本身,并始终引用嵌套路径,从对象的根级别开始。在这种特殊情况下,Book
和Article
的结构是相同的,因此没有区别。但是,如果我想使用关联并独立于其上下文引用它,似乎应该有另一种方法。
思潮?
我整理了一个要点来说明这个完整的例子。
更新
我对迈克·阿斯基的观点感到无奈,即这是不可能的。但为了保持我的逻辑抽象,我创建了一个统一命名的绑定,指向该关联,无论它可能被埋在哪里,每次我连接Outlet时。当我调用 connectOutlet 时,我知道我要发送到控制器/视图的对象类型,因此视图可以使用绑定,而不需要知道对象的其余部分。
尝试直接传递article
或book
实例作为summaryOutlet
上下文,而不是summary
。然后,在视图中,使用:
{{view.content.summary.text}}
而不是你目前肯定拥有的:
{{view.content.text}}
这样,绑定将在加载记录数据后立即刷新。
我没有看到任何替代方案:虽然关系没有填充在实例中,但如果您尝试在同步的命令式管理器中遍历它们,您将始终null
......