У меня есть нокаут-расширение, knockout-secure-binding, и мы столкнулись с an issue.Knockout binding value.update не вызывается с пользовательской привязкой и defineProperty
В частности, при использовании Object.defineProperty
, так как knockout-es5 делает, value
связывание update
-й функция не вызываются, когда событие изменения инициируются на input
.
Мои unit tests иллюстрируют особенности. Это работает:
it("reads an input `value` binding", function() {
var input = document.createElement("input"),
evt = new CustomEvent("change"),
context = { vobs: ko.observable() };
input.setAttribute("data-sbind", "value: vobs")
ko.applyBindings(context, input)
input.value = '273-9164'
input.dispatchEvent(evt)
assert.equal(context.vobs(), '273-9164')
})
Это (будучи как Нокаут-ES5 определяет свойства) не работает:
it("reads an input `value` binding for a defineProperty", function() {
// see https://github.com/brianmhunt/knockout-secure-binding/issues/23
var input = document.createElement("input"),
evt = new CustomEvent("change"),
obs = ko.observable(),
context = { };
Object.defineProperty(context, 'pobs', {
configurable: true,
enumerable: true,
get: obs,
set: obs
});
input.setAttribute("data-sbind", "value: pobs")
ko.applyBindings(context, input)
input.value = '273-9164'
input.dispatchEvent(evt)
assert.equal(context.pobs, '273-9164')
})
В последнем случае, как уже упоминалось, value.update
не вызывается, когда input.dispatchEvent
называется.
Пользовательская привязка возвращает свой valueAccessor
, поэтому я ожидаю, что проблема связана с этим. Мне просто кажется особенно странным, что он будет работать с объектом, но не defineProperty
.
Awesome. [Очень полезно] (https://github.com/brianmhunt/knockout-secure-binding/commit/6263979f9dc111ad847d8f2b83bcfa6fa6f2453f). Приветствия. –
Стоит отметить, что Knockout предоставляет только '_twoWayBindings' (т. Е. Не' twoWayBindings'). См. [KSB/issues # 29] (https://github.com/brianmhunt/knockout-secure-binding/issues/29). Приветствия. –