0

在我的项目中,我有以下三个模型:

  • 俱乐部模型:代表一个体育俱乐部。它有一个clubMeta和多个customCourts
  • ClubMeta 模型:与应用程序相关的俱乐部相关信息。
  • CustomCourt 模型:属于club. 一个俱乐部应该有customCourts 仅当clubMeta.customCourtsEnabledtrue

俱乐部

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

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

module.exports = Club;

俱乐部元

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

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

module.exports = Clubmeta;

海关法庭

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;

我需要做的是一个模板,俱乐部(即登录用户)只有在. 正如我在另一个 SO question中被告知的那样,我应该使用 an来处理。clubmeta.customCourtsEnabledtrueArrayControllerCustomCourts

到目前为止一切都很好,问题来了,因为CustomCourtsController需要了解clubclubmeta。我已经尝试过了,绑定路径有一些变化:

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

当前俱乐部控制器

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总是返回未定义。这样做的正确方法是什么?

4

2 回答 2

2

ClubCourtsController.customCourtsEnabled 总是返回 undefined。这样做的正确方法是什么?

你在正确的轨道上。对于初学者来说,进行绑定的正确方法是通过controllers属性:

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

除此之外,通常最好的做法是在路由的 setupController 挂钩中而不是控制器 init 中将事物连接在一起。因此,即使您拥有该绑定权,也可能是其他问题导致 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 回答