【发布时间】: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