Использование обработчика привязки щелчка нокаута и привязки javascript (ECMAScript 5)

#javascript #knockout.js #binding

#javascript #knockout.js #привязка

Вопрос:

У меня проблемы с пониманием того, почему следующий код не работает в Knockout.

Пример

В javascript myFunction .bind() должна возвращать функцию, содержащую вызов FUNCTION1 с предоставленными параметрами. Я прав?

Теоретически, следующий код должен работать, переданный параметр ‘hey’ должен быть получен функцией this.path.to.method.

Однако этого не происходит, вместо этого я получаю что-то вроде экземпляра ViewModel, за которым следует объект event.

Почему?

Мне интересно, что именно он делает, чтобы понять, могу ли я использовать .bind или я всегда буду вынужден обернуть его внутри функции (){ /* любой вызов здесь … */ } внутри привязки нокаута ‘click’.

Ссылка на JSFiddle:http://jsfiddle.net/darknessm0404/X2yd7

 <a data-bind="click: path.to.method.bind('hey', $data)">
    Why p1 and p2 do not receive the good parameters with arguments like ['hey', $data] when click happens?
</a>

function VM(){
    // In my model, I am namespacing things this way:
    this.path = {
        to: {
            method: function(p1, p2) {
                console.log(((p1 === 'hey')?'First parameter is as expected':'First parameter is NOT as expected'));
                debugger;
            }
        }
    }
}
ko.applyBindings(new VM());
  

Ссылка на JSFiddle:http://jsfiddle.net/darknessm0404/X2yd7

Да, это работает…

…с data-bind=»click: function(){ path.to.method(‘hey’, $data); }»

Однако он менее читабелен, чем другой.

Чего я не понимаю в вызове .bind?

Спасибо за вашу помощь.

Ответ №1:

Правильный синтаксис

 <a data-bind="click: path.to.method.bind($data, 'hey')">
  

ДЕМОНСТРАЦИЯ

Смотрите пример документа knockout.

На самом деле, первый параметр bind будет передан как this значение в вашей функции.
Итак , первый параметр в вашей функции является вторым параметром в bind .

Проверьте документ js:

Синтаксис

fun.bind(thisArg[, arg1[, arg2[, …]]])

Параметры

Это значение, которое должно быть передано в качестве параметра this целевой функции при вызове связанной функции. Значение игнорируется, если связанная функция создается с использованием оператора new.

Комментарии:

1. Да, это thisArg, я искал спецификацию, когда вы опубликовали это ^^ Я забыл, что это работает как .call и .apply!

2. @MykaEyl В этом, собственно, и заключается смысл этого метода. Спасибо, что сделали для меня 4k 🙂

3. Ну, в моем случае мне не «нужно» было переписывать «это», поскольку я его не использую. Я использовал его только для вызова метода (который не использовал ключевое слово this), поэтому я запутался ^^ Поздравляю с вашими 4k 😉