【问题标题】:Binding to a Binary Tree in Knockoutjs在 Knockoutjs 中绑定到二叉树
【发布时间】:2011-11-07 01:03:10
【问题描述】:

我正在寻找一些关于将 knockoutjs 绑定到具有dependentObservables 的二叉树的建议。

我正在开发一个涉及 javascript 中二叉树的 Web 项目。二叉树实现已经完成,我在使用 Knockoutjs 时遇到了问题。

二叉树实际上没有任何属性,只有几个方法(addNode、inorderTraversal、getLength、getDepth、toJSON 等),所以我不知道如何将它设置为 observable。我真的很想拥有一些从二叉树中获取一些信息的dependentObservables。

作为一个简单的例子,我想至少为树的长度设置一个dependentObservable。它似乎永远不会被解雇......

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

以下将节点添加到树中,但 TreeLength 永远不会触发。

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

【问题讨论】:

  • 将节点添加到 bTree 时会发生什么?您的dependentObservable 将依赖于bTree,但除非它被更新,否则它不会触发重新评估。如果实际的 observable 没有改变并且只是 bTree 对象上的属性,您的 API 可能想要调用 bTree.valueHasMutated()
  • @RP Niemeyer - 在内部,节点只是在适当的位置添加到树中(长度和深度函数将返回新值)。它可能由多个事件触发。界面或淘汰赛中没有任何反应。你能告诉我更多关于如何使用 bTree.valueHasMutated 的信息吗?
  • 每个 observable 都有一个可用的 valueHasMutated 方法。它告诉 observable 向它的订阅者发送信号,告诉它发生了一些变化。通常你不必自己调用它,因为它发生在你更新 observable 或调用 observableArray 上的数组方法时。但是,在您实际上并没有更新可观察对象而只是一个子属性的情况下,您可能需要考虑在对树进行更新后让您的 API 调用 valueHasMutated。
  • 啊!我刚刚发现 observable 对象有 ValueHasMutated。我试图弄清楚如何将它直接添加到 binaryTree 并将其与淘汰赛一起使用...以前,我只是在重置观察到的对象,所以这不会改变代码行数,但也许我可以将回调函数传递给树并以这种方式调用它。谢谢!
  • 嗨,迈克尔,如果您设法找到解决方案,您能否回答您的问题以帮助未来的人们。

标签: binary-tree knockout.js observable


【解决方案1】:

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); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多