【问题标题】:An aesthetic or correct way of invoking an action that requires DOM manipulation as well as controller related tasks in EmberJS在 EmberJS 中调用需要 DOM 操作以及控制器相关任务的操作的美观或正确方式
【发布时间】:2014-02-03 03:01:25
【问题描述】:

我的 EmberJS 应用程序有几个动作(由按钮触发),这些动作需要视图/DOM 操作以及在控制器中设置状态,然后是模型更新。我这样做的方式并不符合我的编程美学。它完成了工作,但看起来不太好:(

这是我做事的要点:

<button {{action 'whatever' target='view'}}></button>

App.MyView = Ember.View.extend({

   actions:{
       whatever:function(){
         var ctrl = this.get('controller');
         ctrl.set('property',value); // arbitrary example of setting a controller property through it's view
         ctrl.controllerMethod(); // invoking a controller method through the view
         **// do some DOM manipulation**  
       }
   }    
});

当然,我可以将我在视图中执行的任何与控制器相关的步骤包装在控制器方法中,并通过视图调用该方法,但 IMO 这同样丑陋。视图不应该真的像我所做的那样调用控制器方法。不幸的是,这个特定的动作需要一个 DOM 操作以及设置一些状态并在控制器中执行一个动作。

我不确定执行此操作的推荐方式是什么。任何人都可以开导吗?

【问题讨论】:

  • 你能描述一下 DOM 操作吗?理想情况下,DOM 更改将由数据绑定触发,因为控制器状态已更改。
  • 非常有趣,所以本质上是这样的:“添加”或“删除”视图。这些视图是由数组控制器支持的集合视图的一部分。正在阵列控制器中设置状态。视图由数组控制器中可用的内容动态生成。请注意:在数组控制器中设置状态时,不会删除或添加内容。
  • 我不完全遵循;也许你可以做一个jsbin来说明?

标签: view ember.js ember-controllers


【解决方案1】:

我建议您处理来自控制器的操作。我注意到你正在设置一个属性。您可以使用它向视图发出信号,然后在视图中执行 DOM 操作。

App.MyView = Ember.View.extend({
   function () {
     **// do some DOM manipulation**  
   }.observe('controller.property'); 
});

我的想法是 UI 的“动作”被映射到一个业务事件(例如 addClient 而不是点击),然后发生一些可能会改变模型、控制器的属性的事情。由于这些更改,视图可能需要直接更新,最好是通过绑定,但有时需要手动修改 DOM。

【讨论】:

  • 没试过,但直觉上似乎是正确的
【解决方案2】:

正如@LukeMelia 在他的评论中所说,您应该真正处理控制器中的更改并通过数据绑定更新您的视图(如果需要?)。

所以,您只需从视图助手中省略 target="view" 参数,Ember 就会在最近的控制器中寻找正确的操作,一直冒泡到路由,等等。

一个简单的代码 sn-p(使用您在第一篇文章中提供的内容)如下所示:

车把模板:

<button {{action someAction}}>Fire!</button>

Ember.Controller:

App.MyController = Ember.ObjectController.extend({
  myProperty: 'cool',

  printMyCoolness: function () {
    console.log("I'm using Ember.js!");
  },

  actions: {
    someAction: function () {
      this.set('myProperty', 'set on fire!');
      this.printMyCoolness();
    }
  }
});

【讨论】:

  • 感谢@herom。但是上面的解决方案是非常基本的,当我意识到这个任务需要在控制器和视图之间来回时,我到达了@target = "view"。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多