-1

MyViewModel の一部に新しい observableArray-properties を追加するカスタム ハンドラーを作成して、ハンドラーによってバインドされた要素内のネストされたテンプレートが常に正しい配列を持つようにしました。完全な例については jsfiddle を参照してください

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

ハンドラー内で、現在のオブジェクトに(私の例では「子」)bindingContext.$dataという名前のプロパティとして監視可能なオブジェクトがあるかどうか、またその監視可能なオブジェクトに名前(「pos1」)を持つ独自の監視可能な配列があるかどうかを確認しました。 -そして、不在の場合は、私が彼らを評価します。valueAccessor()[0]valueAccessor()[1]

最初に、 valueHasMutated() を試し、ここに示すようにオブザーバブルをリセットしました

//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

4

1 に答える 1

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]]();
于 2013-08-15T19:39:58.177 に答える