Knockout.js ES6课程和每个人的淘汰赛

Knockout.js ES6课程和每个人的淘汰赛,knockout.js,ecmascript-6,Knockout.js,Ecmascript 6,我对使用ES6类的绑定上下文有问题 这里有一个解释 当我在类上声明一个click函数时,比如 class viewModel { constructor() { this.data = ko.observableArray([{ firstName: "phil" }, { firstName: "person" }]); this.selectedPerson = ko.observable("none selected"); } sel

我对使用ES6类的绑定上下文有问题

这里有一个解释

当我在类上声明一个click函数时,比如

class viewModel {
    constructor() {
        this.data = ko.observableArray([{ firstName: "phil" }, { firstName: "person" }]);
        this.selectedPerson = ko.observable("none selected");
    }
    selectUser(data){
        console.log(this);
        this.selectedPerson(data.firstName);
    }
}
我必须在标记中提供如下绑定:

但是当我在构造函数中声明click时,我不必提供上下文

有人知道为什么吗

Knockout的事件绑定(点击
在引擎盖下使用)有三个功能:

  • 传递当前绑定上下文的
    $data
  • 通过比赛
  • 应用绑定到当前
    $data
()

这意味着,当您点击用户时,会发生以下情况:

viewModelInstance.selectUser.apply(user, [user, event]);
如果要在处理程序中引用此
,请务必了解箭头函数、原型方法和“未绑定”属性函数之间的区别:

this.doSomething = function () { /* ... */ };
this.doSomething = () => { /* ... */ };

MyClass.prototype.doSomething = function() { /* ... */ };
当你写作时:

this.selectUser = (data) => { /* ... */ };
你基本上做到了:

this.selectUser = function(data) { /* ... */ }.bind(this);
这意味着
viewModel
实例已“固定”/绑定到该方法。在构造函数之外定义它使它成为一个原型方法,可以被其他代码绑定到任何
这个
上下文


搜索“es6箭头功能”和
this
,以找到有关其工作原理的更多答案。例如:

为了避免调用.bind($parent/$/root),我可以在构造函数中声明它以正确地进行“this”绑定?我想我们应该避免在构造函数中使用逻辑,还是这只适用于类型化语言?在构造函数中定义它有其缺点(比如:每个实例都重新定义了方法),但它会起作用。或者,您可以在每个用户中包含对选择模型的引用,并使他们拥有自己的
select
方法(我个人的偏好)。第三种选择是使用A在模型之间进行通信。(对于这个直截了当的例子来说似乎有些过分了)我也喜欢第二个(如果我们在同一个页面上,那么ref也是如此),但是如何处理来自服务器的动态数据呢?我们需要在每个函数上循环并添加一个select函数。或者使用映射util。还是说我完全失去了目标?没有失去目标;这正是我的意思。如果您使用的是来自服务器的普通对象,我建议您使用构造函数创建一个视图模型,该构造函数同时处理原始数据和选择逻辑。例如:另一个技巧:您可以将“名称提取逻辑”放在一个computed中,这将允许您只传递存储选择的observable,而不是setter函数:我建议使用。有了它,你可以写一个方法作为箭头函数