2013-03-12 3 views
0

В моем проекте, у меня есть следующие три модели:ember.js - Привязка к модели другого контроллера

  • Club Модель: представляет спортивный клуб. Он имеет один clubMeta и многие customCourts.
  • ClubMeta Model: информация о клубе, относящаяся к приложению.
  • CustomCourt Модель: принадлежит club. A клуб должен иметь customCourts только если clubMeta.customCourtsEnabled is 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; 

Что мне нужно сделать, это шаблон, в котором клуб (который является зарегистрированным пользователем) может добавить customcourts, только если clubmeta.customCourtsEnabled is true. Как мне сказали в another SO question, я должен использовать ArrayController для обработки CustomCourts.

Все нормально до этого момента, то проблема не приходит, потому что CustomCourtsController нужно знать о клуб и clubmeta. Я попробовал это, с некоторыми вариациями на пути связывания:

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 всегда возвращает неопределенное значение. Каков правильный способ сделать это?

ответ

2

ClubCourtsController.customCourtsEnabled всегда возвращает неопределенное. Каков правильный способ сделать это?

Вы на правильном пути. Для начала правильного способа сделать кант через 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']); 
    } 
}); 
+0

Удивительного, Майк. В вашем ответе так много полезной информации, и теперь она работает. –

1

Вы должны получить доступ к контроллеру через controllers собственности

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

Спасибо за ваш ответ слишком Брэдли –

Смежные вопросы