0

我正在玩一个由 Ember 数据支持的 Ember 应用程序。领域语言有点具体,所以我将使用术语库和图像来表示模型。这两者是相关联的:Gallery 有很多图像。

当我路由到画廊时,插座中填充了galleryView,它将所有图像呈现为缩略图。它还有一个出口,“选定”图像显示为全尺寸。这在使用嵌套路由时效果很好。

对我来说,关键是我希望画廊的索引路由默认显示画廊中的第一张图片。我发现这实施起来有点棘手。

在路由时,画廊可能尚未从后端获取。这对画廊本身没有任何问题,但我没有设法引用尚未加载的画廊的尚未加载的关联图像。

    connectOutlets: function(router) {
      var controller = router.get('galleryController');
      var context = controller.get('defaultImage');
      controller.connectOutlet('image', context);
    }

defaultImage 是我一直在尝试引用我还不知道其 ID 或真正引用的图像的地方。到目前为止,我还不能从该方法返回一些东西,该方法在加载数据时会实际更新视图。

我会让自己难堪并展示这种方法......即使它现在根本不起作用。

defaultImage: Ember.computed(function() {
  var image = Ember.Object.create({
    isLoaded: false
  });
  if (this.get('content.isLoaded')) {
    var images = this.get('content.images');
    image = images.objectAt(0);
  }
  return image;
}).property('content.isLoaded')

因此,它正在侦听 GalleryController 的内容并尝试返回一个空对象或结果中的“第一个”图像。

我是否应该甚至不尝试任何类似的操作,而是在加载画廊后触发转换?如果是这样,我喜欢关于在哪里“安全地”触发该转换的提示。它应该仅在达到画廊索引状态时触发,而不是在每次加载画廊时触发。

我现在不再胡说八道了。请让我澄清我的问题的任何部分,我会更新它。

4

1 回答 1

2

假设您有一个 GalleryController 和一个 SelectedImageController,您可以使用 connectControllers 将两者连接起来。就像是:

App.GalleryController = Ember.ArrayController.extend({
    content: [],
    selectedImage: null
    // other stuff
});

App.ImageController = Ember.Controller.extend({
    contentBinding: 'galleryController.selectedImage',
    galleryController: null,
    // other stuff
});

然后在你的connectOutlets中:

connectOutlets: function(router) {
    //your other outlets, data fetching etc
    router.get('imageController').connectControllers('gallery');
}

现在,由于绑定了两个控制器,您只需要将 App.GalleryController.selectedImage 属性设置为列表中的第一项。这可以在 App.GalleryController.content 更新时完成。

于 2012-09-21T10:20:17.453 回答