0

我有一个案例是我需要根据控制器的初始属性值选择视图的模板。因此,当我在视图的 init 钩子中时,我需要访问控制器,但是当我访问控制器时,它返回“null”。

MyApp.ApplicationController = Em.Controller.extend({
  templateVersion: 'small'
});

MyApp.ApplicationView = Em.View.extend({
  init: function(){
    this._super();
    console.log('Controller is: ',this.get('controller'));
    if(this.get('controller').get('templateVersion') == 'small')
    {
      this.set('templateName', 'application-small');
    } else {
      this.set('templateName', 'application-bigger');
    }
  }
});

这不是真实案例,而是真实场景的示例。例如,我在这里设置了一个 jsbin

4

1 回答 1

2

我想更合适的方法是动态确定templateName,如下所示:

MyApp.ApplicationView = Ember.View.extend({
  templateName: function() {
    if (this.get("controller.templateVersion") == "small") {
        return "application-small";
    } else {
        return "application-bigger";
    }
  }.property('controller.templateVersion')
});

这样做你不需要挂钩到init函数中,因此你的控制器属性不可用。

这是您更新的jsbin

更新

在您的最后评论之后,我意识到延迟是使您的用例工作的重要部分,这是一个改进的版本,即使templateVersion最初没有定义并且设置有一些延迟,它确实会发生变化,这次我们观察的templateName属性查看并调用一个rerender.

MyApp.ApplicationView = Ember.View.extend({
  templateName: function() {
    if (this.get("controller.templateVersion") == "small") {
      return "application-small";
    } else {
      return "application-bigger";
    }
  }.property('controller.templateVersion'),
  templateChanged: function() {
    this.rerender();
  }.observes('templateName')
});

这里是另一个带有新版本的jsbin,模拟延迟为 2 秒,但它可以是任何值。

希望能帮助到你。

于 2013-08-02T07:41:49.530 回答