2013-03-12 53 views
0

在我的項目,我有以下三種模式:Ember.js - 綁定到另一個控制器的模式

  • 俱樂部模式:代表一個體育俱樂部。它有一個clubMeta和許多customCourts
  • ClubMeta模型:與應用程序相關的俱樂部相關信息。
  • CustomCourt型號:屬於club。 A 俱樂部應該有customCourts只有如果clubMeta.customCourtsEnabledtrue

俱樂部

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.customCourtsEnabledtrue。正如我在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總是返回undefined。什麼是正確的方法來做到這一點?

回答

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

最好的,邁克。答案中提供了非常有用的信息,現在就開始工作。 – 2013-03-12 14:43:56

1

您需要通過controllers財產

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

謝謝您的回答太布拉德利 – 2013-03-12 14:44:12

相關問題