У меня возникли сложности с примером типо этого. Дело в том что если производишь действия типа этого `test = obj.test`, то при вызове test this ссылается уже на window, так же и у меня было когда обработчик пихал в массив
function Signal(context) {
var self = this
, callbacks = [];
self.add = function(callback) {
if (-1 == callbacks.indexOf(callback)) {
callbacks.push(callback);
} else {
// throw Exception?
}
console.log(callbacks);
};
self.remove = function(callback) {
var index = callbacks.indexOf(callback);
if (index != -1) {
callbacks.splice(index, 1);
} else {
// throw Exception?
}
console.log(callbacks);
};
self.removeAll = function() {
callbacks = [];
};
self.emit = function() {
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(context, arguments);
}
};
}
function Controller() {
var self = this;
var model = {
value: 'foo',
changed: new Signal(self),
change: function(value) {
if (model.value != value) {
model.value = value;
model.changed.emit();
}
}
};
var view = {
informChange: function(val) {
alert("New value of the model is " + val);
}
};
model.changed.add(function() {
view.informChange(model.value);
});
self.run = function() {
setTimeout(model.change, 3000, 42);
};
}
var controller = new Controller();
controller.run();