3

私は、dependentObservablesを使用してknockoutjsをバイナリツリーにバインドするためのアドバイスを探しています。

私はjavascriptのバイナリツリーを含むWebプロジェクトに取り組んでいます。バイナリツリーの実装が完了し、Knockoutjsでの使用で問題が発生しています。

バイナリツリーには実際にはプロパティがなく、いくつかのメソッド(addNode、inorderTraversal、getLength、getDepth、toJSONなど)しかないため、監視可能として設定する方法がわかりません。バイナリツリーからいくつかの情報を取得するいくつかのdependentObservablesが欲しいだけです。

簡単な例として、少なくともツリーの長さに対してdependentObservableを設定したいと思います。解雇されることはないようです...

viewModel.TreeLength = ko.dependentObservable(function(){
return this.bTree().getLength();}, viewModel);

以下はノードをツリーに追加しますが、TreeLengthは起動しません。

viewModel.bTree().addNode(new Node('some data'));
4

1 に答える 1

4

RP Niemeyerは、valueHasMutatedを使用したソリューションを指摘してくれました。最初のラウンドは、ツリーを操作するたびにviewModel.bTree.valueHasMutated()への呼び出しを追加するだけでした。

これが機能することが証明されると、コードがリファクタリングされてコールバックメソッドがツリーに渡されるため、ツリーが変更されるたびにコールバックが呼び出されます。クロージャでいくつかの問題が発生しましたが、最終的に次のようになりました。

function getCallBack(o) 
{
  var obj = o;
  var func = function() 
  {
    obj.bTree.valueHasMutated();
  }

  return func;
}

this.bTreeChanged = getCallBack(this);
model.bTree = new BinaryTree(model.treeData, this.bTreeChanged); 
于 2011-09-12T19:50:01.890 に答える