ember.js Handlebars/EmberJS中Click事件的新语法

xt0899hw  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(212)

如何从以下位置切换:

<Checkbox
   //do I need it to be @onclick?
   onclick={{action "toggleCheckBox" checkBox}}
 />

至:

<Checkbox
  {{on "click" this.toggleCheckBox "test"}}
 />

假设我的控制器没有使用类:

import Controller from '@ember/controller';

export default Controller.extend({
  actions: {
    toggleCheckBox(checkBox) {
      //code
    }
  }
})
jjjwad0x

jjjwad0x1#

尽管你可以在经典的ember类模型中使用新的on修饰符语法,但它与Native类语法配合使用效果最好,因为上下文绑定从{{action}}帮助器移到了@action装饰器。装饰器的用法与Native类语法配合使用非常直观。
1)出于某种原因,如果你仍然需要在经典的ember模型中使用on修饰符,你可以用action装饰器定义来 Package 你的函数(Ember中的装饰器是完全向后兼容的),以便将正确的this上下文绑定到函数。否则,你就不能在函数内部访问正确的this

import Controller from '@ember/controller';
import { action } from '@ember/object';

export default Controller.extend({
  toggleCheckBox: action(function(checkBox) {
    //code
  })
})

但是,与实际的原生类语法相比,上面的代码片段不太直观:

import Controller from '@ember/controller';
import { action } from '@ember/object';

export default AppController extends Controller {
  @action
  toggleCheckBox(checkBox) {
    //code
  }
}

2)在使用on修饰符时,必须使用fn帮助器将参数传递给处理程序。

<Checkbox
 {{on "click" (fn this.toggleCheckBox "test")}}
/>

This Twiddle应该可以帮助您了解这些语法。下面是upgrade guide,它将从传统的事件处理程序转换为新的Octanish语法。Chris's explanation提供了有关新语法的深入解释。

9udxz4iz

9udxz4iz2#

另一个可能的解决方案是使用ember渲染修改器。每次按下复选框时,都会调用该动作。

<Input @class="form-control" @type="checkbox" @checked={{item.checked}} {{did-update this.foo item.checked item}}/>

@action
foo(e, item){
   console.log(item[0], item[1]);
}

其中,“观察”项[0]保存选中值,而项[1]保存整个对象

相关问题