2

为了解释我的问题,我编造了一个人为的例子,所以请耐心等待。我有两个相关的 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'));
  },
}),

也就是说,我希望对特定于书籍的内容有一个视图,对摘要有一个视图,这与是否显示 aBook或无关Article

不幸的是,我不能这样做,book.get('summary')因为null如果这本书没有被 填充store.load(),这会返回,它被异步调用Book.find()

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

想法?

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

更新

我接受 Mike Aski 的观点,即这是不可能的。但是为了保持我的逻辑抽象,我创建了一个统一命名的绑定,指向关联,无论它可能被埋在哪里,每次我 connectOutlet 时。正是当我调用 connectOutlet 时,我才知道要发送到控制器/视图的对象类型,因此视图可以使用绑定并且不需要知道对象的其余部分。

4

1 回答 1

1

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

{{view.content.summary.text}}

而不是你目前肯定拥有的:

{{view.content.text}}

这样,一旦加载记录数据,绑定就会被刷新。

null我没有看到任何替代方案:虽然实例中没有填充关系,但如果您尝试以同步的、命令式的方式遍历它们,您总会得到...

于 2012-08-07T05:37:55.367 回答