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 の例から、このページでこのコードを見つけました。それらはオブジェクト内で宣言されます。最初の関数が使用されず、2 番目の関数が使用される理由を理解したいと思い.bind(this)ます。

いつ、なぜ使用する必要があります.bind(this)か? 使用しても使用しなくても違いはないようです。 の意味はthis、メソッドが宣言されているオブジェクトを常に参照します (メソッドが見つかった無名関数ではありません)。私は正しいですか?

これらのメソッドはどちらもアクセスthis.editingListし、どちらの場合も同じ変数を参照しています。

4

3 に答える 3

3

この例で提供されているフィドルで遊ぶことができます...

を削除しようとすると、 (このメソッドに a を追加すると) ユーザー名.bind(this)を参照することがわかります。これは、関数がユーザー名のループでボタンにバインドされているためです ( )。thisconsole.log(this)removeUser<ul data-bind='foreach: userNames'>

もう 1 つのバインディングでは、フォームにアタッチされ、モデル全体に​​適用されます。

于 2013-11-04T09:12:36.213 に答える
2

removeUser はコールバックで使用することを意図しているようで、コールバックでは TwitterListModel を参照しないため、関数thisとして 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 に答える