当在局部视图中使用插座时,需要和this.get('controllers')给出错误的结果?

时间:2013-09-10 22:04:57

标签: ember.js

嗨,非常感谢你对这个问题的宝贵帮助。

由于我在EmberJS的世界里很新,问题可能来自我而不是Ember,但我找不到正确的解决方法。

我有一个名为a的模板,一个名为AAView的视图(及其模板)和两个控制器AAController和BController。

使用部分方法呈现模板'a':

{{partial'a'}}

AAController是AAView的控制器,连接到AAOutlet,它位于'a'模板中

this.render('aa', {
    outlet: 'AAOutlet',
    into: 'application'
}); 

在这个AAView中,我有一个观察者,应该观察AAController的 isShown 属性。

App.AAView = Ember.View.extend({
    visibilityDidChanged: function() {
        console.log('Visibility just changed man! Do something!');
    }.observes('controller.isShown')
}); 

这个 isShown 变量在AAController然后......

App.AAController = Ember.ObjectController.extend({
    isShown: false
});

此变量在另一个控制器(BController)中设置:

App.BController = Ember.ObjectController.extend({
    needs: ['AA'],
    myVal: '', 
    myValDidChanged:function() {
        //Conditions and a lot of interesting stuffs
        this.get('controllers.AA').set('isShown', true);
    }.observes('myVal')
});

当我的脚本执行并且到达此代码时,视图未通知关于控制器中的更改...

如果我在 this.get('controllers.AA')。set('isShown',true); 行停止调试,似乎 this.get('控制器。 AA')返回另一个(或新的?)控制器,而不是视图使用和观察的控制器。

因此问题出在哪里?如何在BController中检索正确的控制器来编辑值并在视图中触发观察者?

--> Here is a jsFiddle with a simplified version of the problem.

非常感谢你对这个的帮助!

2 个答案:

答案 0 :(得分:1)

来自https://github.com/emberjs/ember.js/issues/3404

的xpost

@Gerfaut这里有几点困惑。

其中使用“AAController”作为名称 - 这会导致一些严重的误导。当您使用以下内容渲染到插座时

this.render('aa', ...

AaController将被解决,而不是AAController。同样适用于AAView,它根本没有连接到UI。 AaView代替了。

请查看:http://jsfiddle.net/x6emd/3/,它可以使用正确的命名方案解决您的问题。

我建议使用:

window.App = Ember.Application.create({
  LOG_TRANSITIONS: true, // basic logging of successful transitions
  LOG_VIEW_LOOKUPS: true,
  LOG_ACTIVE_GENERATION: true
});

帮助您调试命名问题。

答案 1 :(得分:0)

当控制器由Ember实例化时,会为它们分配一个以小写字母开头的名称。这与Ember命名约定一致。试试this.get('controllers.a')。