Пользовательские привязки в KnockoutJS

Я только начал работать с KnockoutJS и столкнулся с проблемой пользовательских привязок. Я назначаю наблюдаемую пользовательской привязке и изменяю эту наблюдаемую через поле ввода. Другое текстовое поле уже реагирует на изменения, но обновление почему-то не запускается.

ko.bindingHandlers.someBinding = {
  update: function(element, valueAccessor) {
    console.log("B");
  }
}

function myModel() {
  this.lastname = ko.observable("name");
}

ko.applyBindings(new myModel());

...

<p data-bind="text: lastname"></p>
<input data-bind="value: lastname" />
<p data-bind="someBinding: lastname" ></p>

https://jsbin.com/kupitepaxe/1/edit?html,js,console,output


person Community    schedule 16.04.2018    source источник
comment
Пожалуйста, используйте сниппеты стека на сайте вместо JSBin за пределами сайта. Редактор сниппетов доступен через Ctrl+M или кнопку панели инструментов [<>]. Вот как сделать фрагмент.   -  person T.J. Crowder    schedule 16.04.2018


Ответы (1)


Это просто потому, что вы никогда не получаете доступ к наблюдаемому внутри привязки, и поэтому KO не думает, что вам нужен этот наблюдаемый.

Просто получите к нему доступ, например:

var currentValue = ko.unwrap(valueAccessor());

Обычно вы бы сделали это как часть своего обработчика привязки, потому что обычно вам нужно значение, но ваш первоначальный тест этого не сделал, поэтому вы не получили ожидаемого результата.

Живой пример:

ko.bindingHandlers.someBinding = {
  update: function(element, valueAccessor) {
    console.log("B");
    ko.unwrap(valueAccessor());
  }
}

function myModel() {
  this.lastname = ko.observable("name");
}

ko.applyBindings(new myModel());
<p data-bind="text: lastname"></p>
<input data-bind="value: lastname" />
<p data-bind="someBinding: lastname" ></p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>

person T.J. Crowder    schedule 16.04.2018
comment
Вероятно, стоит отметить, что вам нужно оставить поле ввода выше, чтобы увидеть обновление обработчика привязки, поскольку по умолчанию KO обновляет только событие change (вы можете сделать его более активным с помощью `, valueUpdate: 'изменение ввода'). - person T.J. Crowder; 16.04.2018