0

私はEmberデータでバックアップされたEmberアプリで遊んでいます。ドメイン言語は少し特殊なので、モデルにはギャラリーと画像という用語を使用します。これら2つは関連付けられています:ギャラリーには多くの画像があります。

ギャラリーにルーティングすると、アウトレットに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のコンテンツをリッスンし、空のオブジェクトまたはおそらく結果の「最初の」画像を返そうとしています。

ギャラリーが読み込まれたら、そのようなことを試してはならず、代わりにトランジションをトリガーする必要がありますか?もしそうなら、Idはその移行を「安全に」トリガーする場所についてのヒントが大好きです。たとえば、ギャラリーが読み込まれるたびにではなく、ギャラリーのインデックス状態に達した場合にのみトリガーする必要があります。

とりとめのないようにします。質問の一部を明確にするように依頼してください。更新します。

4

1 に答える 1

2

1 つの GalleryController と 1 つの SelectedImageController があると仮定すると、connectControllers を使用して 2 つを接続できます。何かのようなもの:

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

これで、2 つのコントローラーがバインドされたので、App.GalleryController.selectedImage プロパティをリストの最初の項目に設定するだけで済みます。これは、App.GalleryController.content が更新されたときに実行できます。

于 2012-09-21T10:20:17.453 に答える