У меня есть множество предметов, возвращающихся из службы. Я пытаюсь определить вычисляемый наблюдаемый объект для каждого экземпляра Item, поэтому мой инстинкт подсказывает мне поместить его в прототип.
Один случай для вычисляемой наблюдаемой: система вычисляет точки, но пользователь может переопределить вычисленное значение. Мне нужно сохранить рассчитанное значение на случай, если пользователь удалит переопределение. Мне также нужно объединить назначенные пользователем и рассчитанные точки и сложить итоги.
Я использую отображение, чтобы сделать следующее:
var itemsViewModel;
var items = [
{ 'PointsCalculated' : 5.1 },
{ 'PointsCalculated' : 2.37, 'PointsFromUser' : 3 }
];
var mapping = {
'Items' : {
create : function(options) {
return new Item(options.data);
}
}
};
var Item = function(data) {
var item = this;
ko.mapping.fromJS(data, mapping, item);
};
Item.prototype.Points = function () {
var item = this;
return ko.computed(function () {
// PointsFromUser may be 0, so only ignore it if the value is undefined/null
return (item.PointsFromUser != null) ? item.PointsFromUser : item.PointsCalculated;
});
};
ko.mapping.fromJS(items, mapping, itemsViewModel);
Как это работает сейчас, я должен вызвать анонимную функцию, чтобы вернуть вычисленное наблюдаемое. Похоже, что создается новый экземпляр вычисляемого наблюдаемого объекта для каждой привязки, что лишает большей части смысла помещать его в прототип. И немного раздражает необходимость расшифровывать, сколько скобок использовать каждый раз, когда я обращаюсь к наблюдаемому.
Он также несколько хрупкий. Если я попытаюсь получить доступ к Points() в коде, я не смогу
var points = 0;
var p = item.Points;
if (p && typeof p === 'function') {
points += p();
}
потому что это меняет контекст Points() на DOMWindow, а не на item.
Если бы я поместил вычисляемый в create() в сопоставление, я мог бы захватить контекст, но тогда была бы копия метода для каждого экземпляра объекта.
Я нашел сообщение Майкла Беста о группах Google (http://groups.google.com/group/knockoutjs/browse_thread/thread/8de9013fb7635b13). Прототип возвращает новую вычисленную наблюдаемую при «активации». Я не понял, что вызывает «активировать» (может быть, Objs?), но я предполагаю, что это все еще происходит один раз для каждого объекта, и я понятия не имею, какую область действия получит «это».
На данный момент, я считаю, что я прошел то, что доступно в опубликованных документах, но я все еще работаю над расшифровкой того, что происходит из источника.