Ember.js适当地引用不相关项目的属性

时间:2012-09-26 19:14:33

标签: javascript ember.js

假设一个带有应用程序控制器的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>

1 个答案:

答案 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')

希望有所帮助!