2012-06-18 2 views
5

Есть ли способ в knockout.js для определенияВизуализируя зависимости для вычисляемых полей в Knockout

  • , какие значения (ko.observable или ko.computed) зависят друг от друга, каким образом (Прецеденты/иждивенцы) и
  • , который Узлы HTML (привязка текста, для стартеров) зависят от текущего значения , поэтому я могу выделить их на экране.

?

Это означает, что я нужен способ, чтобы перейти от HTML узла к подключенному ko.subscribable, а не только к модели представления, как ko.dataFor() делает. Это тоже кажется невозможным.


Я построил веб-приложение, которое работает как электронная таблица - многие числовые значения, которые основываются друг на друга в соответствии с набором бизнес-правил. Некоторые из них рассчитаны, некоторые из них предоставляются пользователям.

В настоящее время я использую свою собственную библиотеку JS, которая выполняет все отслеживание зависимостей и динамическое обновление экрана. Это работает, но я бы хотел поменять его на knockout.js для повышения гибкости и элегантности.

Нокаут отслеживает эту информацию где-то. Как я могу использовать его?


Например, представьте таблицу (HTML-таблицы), которая суммирует несколько целых чисел:

 
    | A B C 
--+--------- 
1 | 4 1 5 
2 | 2 
3 | 3 8 
  • Когда пользователь нажимает на ячейку B3, которые я хотел бы выяснить, что он зависит от B1 и B2 и от этого зависит C3.
  • Когда пользователь нажимает на ячейку C3, я хотел бы узнать, что это зависит от A1, B1, C1, B2 и B3.

ответ

7

Я написал plugin for Knockout (2.0+), основной целью которого является устранение дублирующих обновлений для вычисленных наблюдаемых данных. Но поскольку плагин заменяет объект ko.computed, я также добавил возможность получить список зависимостей/иждивенцев для наблюдаемых. Каждый вычисленный объект имеет метод getDependencies, который возвращает массив наблюдаемых, и каждый наблюдаемый/вычисленный наблюдаемый имеет метод getDependents, который возвращает массив вычисляемых наблюдаемых.

+0

Это выглядит довольно многообещающе. Я предполагаю, что было бы достаточно просто увеличить его, чтобы он отслеживал и прецеденты. Теперь я думаю о пользовательской привязке 'text', которая автоматически регистрирует связанные HTML-элементы, поэтому я могу, например, вызвать вызов' getDependents' в обработчике кликов. – Tomalak

+0

Я не знаю, что вы подразумеваете под «прецедентами». –

+0

Терминология Excel: «Зависимые: значения, зависящие от текущего значения». «Прецеденты: значения, от которых зависит текущее значение». – Tomalak

4

Это очень интересный вопрос - и, кажется, не простой ответ. Я посмотрел на источник нокаута, и похоже, что эти данные хранятся в свойстве _subscriptionsToDependencies, но это, похоже, не публикуется публично.

Я заметил getDependenciesCount, который выставлен - выйдите this fiddle, чтобы увидеть его в действии.

Я по-прежнему расследую это, но похоже, что для этого может потребоваться вилка самого нокаута, если мы не сможем справиться с базовым наблюдаемым. Но вот что я нашел до сих пор, что может оказаться полезным:

Запуск через отладчик, похоже, во время выполнения сокращенная версия нокаута переименовывает свойство _subscriptionsToDependencies в V. Во время эксплуатации значение свойства getDependenciesCount: function(){return v.length}

Надеюсь, это поможет.

Редактировать: Для тех, кто приходит на этот вопрос в поисках ответа, это не представляется возможным в KnockoutJS начиная с версии 2.1

+0

Обычно я сам отвечаю на простые вопросы. ;) - Знание числа зависимостей близко, но не сигары. Кроме того, это ничего не говорит о прецедентах. Вопрос, «какой элемент HTML отображает это значение», произошел и в другом случае в прошлом. На это тоже трудно ответить. – Tomalak

Смежные вопросы