假设一个带有应用程序控制器的ember.js路由器应用程序,应用程序视图,我插入和播放的视图类型,以及处理外部数据的无关控制器。第三个视图如何从不相关的控制器中获得计算属性,我将什么放入.property()
elipses以便获得更改通知?
e.g。
App.ExternalDataController = Em.Controller.extend
stellarProperty: 'super value' #I want OtherView to have a computer property referencing this
App.ApplicationController = Em.ArrayController.extend
content: [] #Assume a bunch of values of some kind here
App.ApplicationView = Em.View.extend
templateName: 'app-view'
App.OtherView = Em.View.extend
templateName: 'other-view'
someComputedProperty: (->
App.router.externalDataController.get('stellarProperty') + ' flying pigs'
).property() #What do I put in that property elipses?
模板
<script type="text/x-handlebars" data-template-name="application">
<div>
{{#each content}}
{{name}} -- {{view App.OtherView}}
{{/each}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="other-view">
<span>Irate goats and {{view.someComputedProperty}}</span>
</script>
答案 0 :(得分:3)
简短的回答是你应该通过视图的控制器提供你需要的属性。
在您的示例中,由于OtherView
嵌套在ApplicationView
的模板中,因此它的controller
属性设置为ApplicationController
。在路由器中,您可以拨打router.applicationController.connectControllers('externalData')
。这将在externalDataController
上设置applicationController
属性。然后你可以揭露你需要的财产:
App.ApplicationController = Em.ArrayController.extend
content: [] #Assume a bunch of values of some kind here
externalDataController: null # set via connectControllers call in router
stellarPropertyBinding: Em.Binding.oneWay('externalDataController.stellarProperty')
OtherView
成为:
App.OtherView = Em.View.extend
templateName: 'other-view'
someComputedProperty: (->
@get('controller.stellarProperty') + ' flying pigs'
).property('controller.stellarProperty')
希望有所帮助!