0

How might I add a can.compute to a can.Control instance prototype? I'm trying to pass it into the instance functions with extend, but all instances of the class share the same single instance of the compute.

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

Obviously I could just do this in the init function, but I'd rather not, so as I inherit from this in the future, I won't have to remember to call the parent init. Just hoping someone has a better way.

ramblinjan
  • 6,578
  • 3
  • 30
  • 38
savinger
  • 6,544
  • 9
  • 40
  • 57

1 Answers1

1

Sharing the same instance is kind of the point of the prototype. You could use a prototype function that returns the new compute. An alternative to using the Controls init would be to use the prototype setup or modifying the options in the static setup:

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);
    }
});
Daff
  • 43,734
  • 9
  • 106
  • 120