Can.js - Добавление can.Compute к прототипу

Как я могу добавить can.compute к прототипу экземпляра can.Control? Я пытаюсь передать его в функции экземпляра с расширением, но все экземпляры класса совместно используют один и тот же экземпляр вычисления.

can.Control.extend('App.Window', {
  ...
},{
  ...
  active: can.compute(true, function(newVal, oldVal) {
    return !!newVal;
  })
});

var a = new App.Window,
    b = new App.Window;

a.active === b.active // true
a.active()           // true
a.active(false)
a.active()         // false
b.active()        // false

Очевидно, что я мог бы просто сделать это в функции init, но я бы предпочел не делать этого, поэтому, поскольку я буду наследовать от этого в будущем, мне не придется вспоминать о вызове родительского init. Просто надеясь, что у кого-то есть лучший способ.

1 ответ

Решение

Совместное использование одного и того же экземпляра является своего рода точкой прототипа. Вы можете использовать функцию-прототип, которая возвращает новое вычисление. Альтернатива использованию элементов управления init будет использовать настройку прототипа или изменить параметры в статической настройке:

can.Control.extend('App.Window', {
  ...
},{
  setup: function(element, options) {
        this.active = can.compute(true, function(newVal, oldVal) {
            return !!newVal;
        });
        return can.Control.prototype.setup.apply(this, arguments);
    }
});
Другие вопросы по тегам