Связывание с бинарным деревом в Knockoutjs - PullRequest
3 голосов
/ 30 августа 2011

Я ищу несколько советов по привязке knockoutjs к двоичному дереву с зависимыми объектами.

Я работаю над веб-проектом, включающим двоичное дерево в javascript.Реализация бинарного дерева была завершена, и я столкнулся с проблемой использования его с Knockoutjs.

Бинарное дерево на самом деле не имеет никаких свойств, только несколько методов (addNode, inorderTraversal, getLength, getDepth, toJSON и т. д.), поэтому я понятия не имею, как настроить его как наблюдаемый.Мне бы очень хотелось иметь несколько зависимых объектов-наблюдателей, которые получают некоторую информацию из двоичного дерева.

В качестве простого примера я хотел бы по крайней мере установить зависимый объект-наблюдатель для длины дерева.Кажется, он никогда не срабатывает ...

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

Следующее добавляет узел в дерево, но TreeLength никогда не срабатывает.

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

1 Ответ

4 голосов
/ 12 сентября 2011

RP Нимейер указал мне на решение со значениемHasMutated.Первый раунд просто добавлял вызов 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); 
...