#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 😉