Возможно ли вычисление наблюдаемых на прототипах в KnockoutJS?

У меня есть множество предметов, возвращаемых со службы. Я пытаюсь определить вычисляемый наблюдаемый объект для каждого экземпляра 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 вместо элемента.

Если бы я поместил вычисляемый в create ()в отображение, я мог бы захватить контекст, но тогда была бы копия метода для каждого экземпляра объекта.

Я нашел пост Майкла Беста в группах Google(http://groups.google.com/group/knockoutjs/browse_thread/thread/8de9013fb7635b13). Прототип возвращает новую вычисленную наблюдаемую при «активации». Я не понял, что вызывает «активировать» (, может быть, Objs? ), но я предполагаю, что это все еще происходит один раз для каждого объекта, и я понятия не имею, какую область действия получит "это".

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

6
задан Chris Hance 24 April 2012 в 14:22
поделиться