为knockout.js中的可观察对象添加属性后为什么会出现TypeError?

时间:2013-08-15 18:43:24

标签: javascript knockout.js typeerror observable ko.observablearray

我正在玩构建一个自定义处理程序,它将新的observableArray属性添加到MyViewModel的部分内容,以确保由我的处理程序绑定的元素中的嵌套模板始终具有正确的数组 - see jsfiddle for full example

<div data-bind="contentAvailable: ['children','pos1']">
    <div data-bind="template: { name: 'default', foreach: children().pos1 }">
</div>

在处理程序中,我检查了当前对象bindingContext.$data是否有一个可观察对象作为名称为valueAccessor()[0]的属性(在我的示例中为'children'),如果该可观察对象又具有它的可观察数组,名称为valueAccessor()[1]('pos1') - 如果缺席,我会帮助他们。

起初我尝试了valueHasMutated() and reseting the observable as shown here

//within the handler
bindingContext.$data[valueAccessor()[0]]()[valueAccessor()[1]]=ko.observableArray([]);
//and after ko.applyBindings(MyViewModel) 
child1.children().pos1().push(new ViewChild(2));
child1.children().pos1.valueHasMutated();

这几乎起作用 - 因为我不想在每次推送一个值时通知有关变异的信息,我试图将valueHasMutated()置于处理程序中 - 在添加observableArray()之后但这会导致在Uncaught TypeError: object is not a function中(上面typeof 1行,否则说XD)。

我是否以一种从根本上错误的方式使用这些对象引用,或者只是缺乏一些理解它如何实现它的魔力? :d

1 个答案:

答案 0 :(得分:0)

仍然在消化你想要做的事情,但是注意到你的绑定处理程序中的i(1)检查中你有i[1]而不是typeof的错字:

if(!bC.$data[i[0]]().hasOwnProperty(i[1]) || typeof bC.$data[i[0]]()[i(1)] !== 'function'){           
        var existing = bC.$data[i[0]]();