【问题标题】:How to get reference of View in Controller如何在 Controller 中获取 View 的引用
【发布时间】:2012-08-29 14:56:01
【问题描述】:

我正在使用 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 为空。我已将 {{debugger}} 放入模板中,这是指 并且 this.view 为空。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么,您对验证有何建议?如何在不调用控制器中的自定义方法的情况下实现它(点击时)
    • 另外,当我改变目标时,会在视图上调用动作,我认为这不合适。
    • 我听说 ember 团队推迟了添加验证框架,直到以后。我会在控制器而不是视图上实现验证,因为控制器应该管理数据。然后,即使您更改其视图,您的验证也会保留。以下是某人已集成到视图中的验证示例:gist.github.com/3301728
    • 我查看了您在上述评论中提供的要点。我理解该代码,但仍然没有解释我们如何确定每个字段(视图)是否有效或仍然存在一些验证问题。在控制器中。我希望你明白我的意思。
    • 实际上,经过进一步思考,我可能会将模型上的验证实现为返回错误数组的函数。所以我会有一个针对路由器的保存操作,在该操作中我会调用 controller.save 函数,然后调用 model.validate 函数。如果返回错误(一个数组),我会在控制器上设置一个错误属性,视图将显示并让函数返回返回 false。如果 controller.save 的返回值为 false,我将中止保存操作。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 2015-04-24
      • 2012-11-24
      • 2013-05-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多