有没有办法在加载之前使用嵌入式ember-data模型关联而不引用根对象?

时间:2012-08-07 02:19:11

标签: ember.js ember-data

为了解释我的问题,我编造了一个人为的例子,所以请耐心等待。我有两个相关的ember-data模型,每个模型都有相同类型的嵌入关联:

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()将返回一个正确类型的对象,即使在从服务器检索实际数据值之前,该对象也可用于呈现视图。但是,我担心这种便利并没有完全延伸到协会。

在这种情况下,当多种类型的对象共享相同类型的关联数据时,我想重用我的视图,显示Summary个对象和Book对象的Article个对象对象。特别是,我想做以下事情:

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'));
  },
}),

也就是说,我希望有一个针对特定于图书的内容的视图,以及一个针对摘要的视图,该视图与是否显示BookArticle无关。

不幸的是,我无法执行book.get('summary'),因为如果null没有填充该书,则会返回store.load()Book.find()异步调用该书。

替代方案似乎是传递书籍对象本身,并始终引用嵌套路径,从对象的根级别开始。在这种特殊情况下,BookArticle的结构是相同的,因此没有区别。但是,如果我想使用一个关联并独立于它的上下文引用它,似乎应该有另一种方式。

思考?

我整理了一个gist来说明这个完整的例子。

更新

我已经向迈克阿斯基辞职了,这是不可能的。但是为了保持我的逻辑抽象,我创建了一个统一命名的绑定,指向关联,每次我都可以埋没,每次我都是connectOutlet。当我调用connectOutlet时,我知道我正在向控制器/视图发送什么类型的对象,因此视图可以使用绑定,而不需要知道对象的其余部分。

1 个答案:

答案 0 :(得分:1)

您应该尝试直接将articlebook实例作为summaryOutlet上下文传递,而不是summary。然后,在视图中,使用:

{{view.content.summary.text}}

而不是你当前拥有的东西:

{{view.content.text}}

这样,只要加载记录数据,就会刷新绑定。

我没有看到任何替代方案:虽然实例中没有填充关系,但如果你试图以同步的,强制性的方式遍历它们,你将始终获得null ...