如何在Controller中获取View的参考

时间:2012-08-29 14:56:01

标签: ember.js

我正在使用Ember 1.0pre并遵循Ember建议的application structure(使用路由器) 对于表单验证,我想在按钮单击上调用 $('form')。valid()方法。 所以我在视图中有以下方法

validate: function(){
  return this.$('form').valid()
}

模板文件中的操作:

<button type="submit" class="btn" {{action doSaveSettings this}}>Save Changes</button>

doSaveSettings 方法在Controller中。 如何在控制器中获取视图实例,以便调用validate方法?

修改
在控制器中,this.view为null。我已将{{debugger}}放在模板中,这是指 &LT; App.XyzController:ember1062&GT;并且this.view为null。

2 个答案:

答案 0 :(得分:1)

在ember 0.9.8.1(我相信)中,操作的默认目标已从视图更改为路由器。要将目标设置为视图,您需要像这样覆盖它

 <button type="submit" class="btn" {{action doSaveSettings target="view"}}>Save Changes</button>

编辑:你的控制器不应该知道视图。

答案 1 :(得分:0)

在ember中,视图的目的只是重复只是为了处理事件或创建可重用的组件 我不建议这样做,因为总是有理由不能从控制器访问视图并且很好地遵循它,但是如果你真的想要使用它,你可以采用以下两种方式:
我不知道你是使用ember-cli还是使用ember,但逻辑是一样的。然而答案是针对ember-cli

//Inside appname/controller/your-conroller.js

import reqdView from 'appname/views/your-view';

//Lets assume u want to call a function called validate inside view
//Add this statement inside the controller to run the validate function

reqdView.prototype.validate();

OR

var reqdViewInst = new reqdView();
reqdViewInst.validate();

如果要验证视图,请在didInsertElement

中进行验证
export default Ember.View.extend({
didInsertElement:function()
{
  this.validate(); 
},
validate:function()
{
//do your validation
}
});

OR

export default Ember.View.extend({
eventManager: Ember.Object.create({
    didInsertElement:function(event, view)
    {
      view.validate(); 
    }
  }),

    validate:function()
    {
    //do your validation
    }
    });