radio/libjs/wController/localModel.js

89 lines
3.0 KiB
JavaScript

"use strict";
var counter = 0;
var Subscribable = require("../utils/subscribable");
var Controller = require("./controller");
var LocalModel = Subscribable.inherit({
"className": "LocalModel",
"constructor": function(properties, data) {
Subscribable.fn.constructor.call(this);
this.properties = [];
this._controllers = [];
this._foreignControllers = [];
if (properties) {
for (var key in properties) {
if (properties.hasOwnProperty(key)) {
var pair = {p: key, k: properties[key]};
this.properties.push(pair);
}
}
}
if (data !== undefined) {
this.data = data;
this.initialized = true;
}
},
"destructor": function() {
for (i = 0; i < this._foreignControllers.length; ++i) {
var pair = this._foreignControllers[i];
global.unsubscribeForeignController(pair.n, pair.c);
global.unregisterForeignController(pair.n, pair.c);
pair.c.destructor();
}
for (var i = 0; i < this._controllers.length; ++i) {
this._controllers[i].destructor();
}
Subscribable.fn.destructor.call(this);
},
"addController": function(ctrl) {
this._controllers.push(ctrl);
},
"addForeignController": function(nodeName, ctrl) {
if (!(ctrl instanceof Controller)) {
throw new Error("An attempt to add not a controller into " + this.className);
}
this._foreignControllers.push({n: nodeName, c: ctrl});
ctrl.on("serviceMessage", this._onControllerServiceMessage, this);
global.registerForeignController(nodeName, ctrl);
global.subscribeForeignController(nodeName, ctrl);
},
"_onControllerServiceMessage": Controller.fn._onControllerServiceMessage,
"removeForeignController": function(ctrl) {
if (!(ctrl instanceof Controller)) {
throw new Error("An attempt to remove not a controller from " + this.className);
}
for (var i = 0; i < this._foreignControllers.length; ++i) {
if (this._foreignControllers[i].c === ctrl) {
break;
}
}
if (i === this._foreignControllers.length) {
throw new Error("An attempt to remove not not existing controller from " + this.className);
} else {
var pair = this._foreignControllers[i];
global.unsubscribeForeignController(pair.n, pair.c);
global.registerForeignController(pair.n, pair.c);
pair.c.off("serviceMessage", this._onControllerServiceMessage, this);
this._foreignControllers.splice(i, 1);
}
},
"setData": function(data) {
this.data = data;
this.initialized = true;
this.trigger("data");
}
});
module.exports = LocalModel;