0

私のプロジェクトには、次の3つのモデルがあります。

  • クラブモデル:スポーツクラブを表します。それは1つとclubMeta多くを持っていcustomCourtsます。
  • ClubMetaモデル:アプリに関連するクラブ関連情報。
  • CustomCourtモデル:に属しclubます。クラブは 、である場合にのみcustomCourtsを持つ必要がclubMeta.customCourtsEnabledありtrueます。

クラブ

var Club = DS.Model.extend({
    ... bunch of properties ...

    clubmeta: DS.belongsTo('App.Clubmeta'),
    customCourts: DS.hasMany('App.CustomCourt')
});

module.exports = Club;

Clubmeta

var Clubmeta = DS.Model.extend({
    ... bunch of properties ...
    customCourtsEnabled: DS.attr('boolean'),

    club: DS.belongsTo('App.Club')
});

module.exports = Clubmeta;

CustomCourt

var CustomCourt = DS.Model.extend({
    name: DS.attr('string'),
    glass: DS.attr('boolean'),
    indoor: DS.attr('boolean'),
    single: DS.attr('boolean'),

    club: DS.belongsTo('App.Club')
});

module.exports = CustomCourt;

私がする必要があるのは、クラブ(ログインしているユーザー)がである場合にのみcustomCourtsclubmeta.customCourtsEnabledを追加できるテンプレートですtrue別のSOの質問で言われたように、私はを使用しArrayControllerて処理する必要がありCustomCourtsます。

この時点まではすべて問題ありません。クラブclubmetaCustomCourtsControllerについて知る必要があるため、問題が発生します。バインディングパスにいくつかのバリエーションを付けて、これを試しました。

var ClubCourtsController = Ember.ArrayController.extend({
        needs: ['currentClub'],
        customCourtsEnabledBinding: Ember.Binding.oneWay("App.currentClubController.content.clubmeta.customCourtsEnabled"),
        ...
});

CurrentClubController

var CurrentClubController = Ember.ObjectController.extend({
    init: function() {
        this._super();
        console.log('Retrieving club ' + App.clubId);
        this.set('content', App.Club.find(App.clubId));
    }
});

module.exports = CurrentClubController;

ただし、ClubCourtsController.customCourtsEnabled常にundefinedを返します。これを行う正しい方法は何ですか?

4

2 に答える 2

2

ClubCourtsController.customCourtsEnabledは常にundefinedを返します。これを行う正しい方法は何ですか?

あなたは正しい方向に進んでいます。手始めに、バインディングを行う正しい方法は、controllersプロパティを使用することです。

var ClubCourtsController = Ember.ArrayController.extend({
    needs: ['currentClub'],
    customCourtsEnabledBinding:     Ember.Binding.oneWay("controllers.currentClub.clubmeta.customCourtsEnabled"),
});

それを超えて、コントローラーの初期化ではなく、ルートのsetupControllerフックで物事を相互に接続することが一般的にベストプラクティスです。したがって、そのバインディングが正しい場合でも、customCourtsEnabledプロパティが未定義になる他の問題が発生する可能性があります。ここにjsbinの実用的な例を投稿しました:http://jsbin.com/ubovil/1/edit

App = Ember.Application.create({
  clubId: 1
});
App.Router.map(function() {
  this.route("customCourts", { path: "/" });
});
App.Club = Ember.Object.extend({});
App.Club.reopenClass({
  find: function(id) {
    return App.Club.create({
      id: id, 
      clubmeta: App.ClubMeta.create({
        customCourtsEnabled: true
      })
    });
  }
});
App.ClubMeta = Ember.Object.extend({});
App.CurrentClubController = Ember.ObjectController.extend({});

App.ApplicationController = Ember.Controller.extend({
  needs: ['currentClub']
});

App.ApplicationRoute = Ember.Route.extend({
  setupController: function(controller) {
    controller.set('controllers.currentClub.content', App.Club.find(App.clubId));
  }
});

App.CustomCourtsController = Ember.ArrayController.extend({
  needs: ['currentClub'],
  customCourtsEnabledBinding: Ember.Binding.oneWay("controllers.currentClub.clubmeta.customCourtsEnabled")
});

App.CustomCourtsRoute = Ember.Route.extend({
  setupController: function(controller) {
    controller.set('content', ['Court a', 'Court b', 'Court c']);
  }
});
于 2013-03-12T12:39:26.207 に答える
1

controllersプロパティを介してコントローラーにアクセスする必要があります

ClubCourtsController = Ember.ArrayController.extend({
  needs: ['currentClub'],
  customCourtsEnabledBinding: Ember.Binding.oneWay("controllers.currentClub.clubmeta.customCourtsEnabled"),
  ...
});
于 2013-03-12T12:21:30.867 に答える