Knockout 拡張機能のknockout-secure-bindingを使用していますが、問題が発生しました。
特に、Object.defineProperty
ノックアウトes5 のように を使用する場合、 で変更イベントがトリガーされたときにバインディングの関数は呼び出されませvalue
ん。update
input
私の単体テストはその特異性を示しています。これは機能します:
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')
})
これ (knockout-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
ます。