2015-12-17 2 views
0

У меня есть простая таблица с двумя входными столбцами, связанными с моделью просмотра (vm). Скажем, одним из свойств является vm.ColA, а другой - vm.ColB.Использование нокаутных наблюдаемых без событий DOM, как построить пару записываемых вычислений

Есть целый ряд других столбцов, так что я использовал

ko.mapping.fromJS(data, {}, this); 

создать наблюдаемые для каждого свойства. Однако ColA и ColB должны иметь возможность принимать входные данные, а когда они это делают, влияют на другие. Например, скажем, существует свойство Factor, такое, что (ColA * Factor = ColB) и (ColA = ColB/Factor).

Мне нужно указать значение в ColA и вычислить ColB, но если я введу значение в ColB, он должен вычислить ColA.

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

+0

http://stackoverflow.com/questions/30717905/how-can-i-get-two-computed-values-to-bind-to-each-other –

ответ

0

Для реализации такой зависимости вам необходимо указать explicitly subscribe, чтобы изменить значение colB при изменении и наоборот.

colA.subscribe(function(newValue) { 
    colB(/* calculation based upon colA newvalue */); 
}); 

Проблема заключается в том, как тх colA зависит от colB и наоборот вы можете войти в бесконечный цикл (если расчеты не являются точными, а значения не изменяется при выполнении вычислений, которые не Guarranteed). То есть при изменении colA изменения подписки colB, чья подписка, в свою очередь, изменяет colA и так далее.

Чтобы избежать этой рекурсии, вы можете реализовать такое решение: Change observable but don't notify subscribers in knockout.js или что-то подобное. Вопрос в том, что когда colA изменений colB, colA не должен быть уведомлен colB изменить.

Другим возможным решением является проверка того, что результат вычисления приблизительно равен значению в другом наблюдаемом, и в этом случае вы не меняете его, чтобы разбить цикл. То есть если результат вычисления colB, когда изменения colA приблизительно равны значению в colB, вы не изменяете значение в colB.

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