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

时间:2012-09-11 09:44:49

标签: ember.js ember-old-router

我正在尝试将我的应用程序移动到使用“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在App上查找视图定义并实例化它
  2. Ember在App上查找控制器定义并创建它的实例
  3. 如下所示将两者挂钩:设置视图控制器属性并设置控制器视图属性
  4. ---一直工作到最后一步。我似乎无法在控制器上设置视图属性。

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

    相关代码:

    App.Router

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

    最后它返回一个大胖子。

    我做错了什么,或者这是应该的样子?

    BTW:这是使用ember-1.0.pre。

2 个答案:

答案 0 :(得分:3)

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

但是,当前实现确实控制器上设置视图,而不是您期望的控制器。在上面的示例中,view的{​​{1}}属性将设置为applicationController的实例。

来自Ember来源的相关代码:

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

答案 1 :(得分:2)

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

依赖关系遵循链:V - > C - >中号

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