我有一个 Knockout 扩展,knockout-secure-binding,我们遇到了一个问题。
特别是在使用 时Object.defineProperty
,就像knockout-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')
})
这(作为淘汰赛 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
。