Така че имам персонализирано нокаут обвързване за обработка на времетраене. Имам проблем, при който стойност в един от моите формуляри може да е продължителност, но може да бъде и низ или друга стойност. Проблемът възниква от факта, че стойностите на продължителността са представени като обекти с две свойства, duration и time_unit (което само по себе си е обект с 2 свойства. Имам различните обвързани възли, свързани вътре в if обвързвания.
init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
var allBindings = ko.toJS(allBindingsAccessor() || {}),
source = allBindings.source || [],
observable = valueAccessor(),
value = ko.toJS(ko.utils.unwrapObservable(observable)),
duration = new DurationControl({
inputNode: inputNode,
source: source,
defaultValue: value
});
//attach duration control to element and render here
ko.utils.registerEventHandler(inputNode.getDOMNode(), 'blur', function () {
var observable = valueAccessor();
if (!observable.viewModelUpdating) {
observable.viewModelUpdating = ko.observable(false);
}
if (duration.isValueValid(true)) {
observable.viewModelUpdating(true);
observable.duration(duration.getDuration());
observable.time_unit.value(duration.getTimeUnit());
observable.time_unit.id(sourceIdValueMap[duration.getTimeUnit()] || 0);
observable.viewModelUpdating(false);
}
});
}
И моят обвързан html
<!-- ko if: type() == 'string' -->
<div class="control wide">
<input type="text" data-bind="value: value" />
</div>
<!-- /ko -->
<!-- ko if: type() == 'duration' -->
<div class="control">
<input type="text" data-bind="duration: value, source: metadata.time_units" />
</div>
<!-- /ko -->
Ако направя първоначалното обвързване със стойност, която е правилният формат на обекта, така
...,
value: {
duration: '',
time_unit: {
value: '',
id: '',
}
},
...
всичко работи чудесно. Но ако започна със стойност в някакъв друг формат, като ..., value: 'nada', ...
, той се прекъсва при опит за достъп до observable.duration (и observable.time_unit.*).
Когато оценявам стойността с правилната настройка, получавам обекта, описан по-горе, обратно. Ако се опитам ръчно да добавя свойствата duration/time_unit като наблюдаеми, пак просто изваждам обратно празния низ.
Как най-добре да актуализирам viewmodel/bindings/etc от моята init функция, така че да се държи така, сякаш моделът първоначално е бил в това състояние, когато съм го инициализирал?