Emberjs路由器:未在关联的控制器上定义视图属性



我正试图将我的应用程序移动到使用"outlet"的新Emberjs路由器组件。

参考文献:http://emberjs.com/guides/outlets/并且这个:http://codebrief.com/2012/07/anatomy-of-an-ember-dot-js-app-part-i-redux-routing-and-outlets/

我如何理解这一点:当你使用字符串连接插座时,会发生以下情况

  1. Ember在应用程序上查找视图定义并对其进行实例化
  2. Ember在应用程序上查找控制器定义并创建其实例
  3. 像这样将两者挂钩:设置视图控制器属性和设置控制器视图属性

---工作良好,直到最后一步。我似乎无法在控制器上设置视图属性。

JSBin在此:http://jsbin.com/ekekir/40/edit

相关代码:

应用程序路由器

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({
    state1: Ember.Route.extend({
      route: '/state1',
      connectOutlets: function (router) {
        router.get('applicationController').connectOutlet('state1')
      }
    })
  })
});

控制器和视图

App.State1View = Ember.View.extend ({ 
  templateName: 'state1',
  submit: function () {
    this.get('controller').doLogView();
    return false;
  }
});
App.State1Controller = Ember.Controller.extend({
  doLogView: function () {
    console.log('Getting controller view:');
    console.log(this.get('view'));
  }
});

最后,它返回一个大的胖null。

我是做错了什么,还是应该这样?

BTW:这是使用ember-1.0版本的

Mike Aski认为控制器不应该知道视图是正确的。

然而,当前的实现实际上确实设置了控制器上的视图,而不是您期望的控制器。在上面的示例中,applicationControllerview属性将设置为State1View的实例。

Ember的相关代码来源:

https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/system/controller.js#L140

这是一种正常行为,因为控制器不必知道呈现其内容的视图。你会有一个依赖循环(和一个破碎的设计…)

依赖关系遵循以下链条:V->C->M

此外,控制器被注入一次,每次显示时都会创建视图。