2
var TwitterListModel = function (lists, selectedList) {
    // [...]

    this.addUser = function () {
        if (this.userNameToAdd() && this.userNameToAddIsValid()) {
            this.editingList.userNames.push(this.userNameToAdd());
            this.userNameToAdd("");
        }
    };

    this.removeUser = function (userName) {
        this.editingList.userNames.remove(userName)
    }.bind(this);

    // [...]
}

我在这个页面的 Knockout JS 示例中找到了这段代码。它们在对象内部声明。我想了解为什么第一个函数不使用.bind(this)而第二个函数使用。

何时以及为什么需要使用.bind(this)?看起来我是否使用它没有任何区别: 的含义this始终指的是声明方法的对象(而不是找到它的匿名函数)。我对吗?

这两种方法都可以访问this.editingList并且它们在两种情况下都引用相同的变量。

4

3 回答 3

3

你可以玩他们为这个例子提供的小提琴......

如果您尝试删除,.bind(this)您将看到this(在此方法中添加一个console.log(this))然后是指用户名。这是因为removeUser函数绑定在用户名 ( <ul data-bind='foreach: userNames'>) 上的循环中的按钮上。

对于另一个绑定,它附加到表单,然后与整个模型一起使用。

于 2013-11-04T09:12:36.213 回答
2

似乎 removeUser 打算在回调中使用,并且在回调this中不会引用 TwitterListModel,所以他们明确地将 TwitterListModel 分配给this函数

于 2013-11-04T08:58:24.030 回答
1

removeUser绑定到数组中行的上下文。

$root指出父项,但是当调用单击处理程序时,this上下文将指向单击的项目。这是 KO 团队设计的。

你也可以这样解决

<button data-bind='click: $root.removeUser.bind($parent)'>Remove</button>

这也适用于原型函数声明

于 2013-11-04T09:28:48.123 回答