|
|
|
;(function () {
|
|
|
|
var contexts = {};
|
|
|
|
|
|
|
|
var WORKER;
|
|
|
|
BI.useWorker = function (wk) {
|
|
|
|
WORKER = wk;
|
|
|
|
|
|
|
|
var _init = BI.Widget.prototype._init;
|
|
|
|
BI.Widget.prototype._init = function () {
|
|
|
|
this.$destroyWorker = createWorker.call(this);
|
|
|
|
try {
|
|
|
|
_init.apply(this, arguments);
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var _initRender = BI.Widget.prototype._initRender;
|
|
|
|
var postMessage = function (data) {
|
|
|
|
switch (data.eventType) {
|
|
|
|
case "create":
|
|
|
|
this.model = data.msg;
|
|
|
|
_initRender.call(this);
|
|
|
|
break;
|
|
|
|
case "watch":
|
|
|
|
var watchArgs = data.args;
|
|
|
|
this.watch[data.currentWatchType].apply(this, watchArgs);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
BI.Widget.prototype._initRender = function () {
|
|
|
|
if (WORKER && this._worker) {
|
|
|
|
this.__asking = true;
|
|
|
|
this.__async = true;
|
|
|
|
} else {
|
|
|
|
_initRender.apply(this, arguments);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var unMount = BI.Widget.prototype.__d;
|
|
|
|
BI.Widget.prototype.__d = function () {
|
|
|
|
this.$destroyWorker && this.$destroyWorker();
|
|
|
|
try {
|
|
|
|
unMount.apply(this, arguments);
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
if (WORKER) {
|
|
|
|
WORKER.addEventListener("message", function (e) {
|
|
|
|
var data = e.data;
|
|
|
|
postMessage.apply(contexts[data.name], [data]);
|
|
|
|
}, false);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function createWorker () {
|
|
|
|
var self = this;
|
|
|
|
if (this._worker) {
|
|
|
|
var name = this.getName();
|
|
|
|
var modelType = this._worker();
|
|
|
|
var options;
|
|
|
|
if (BI.isArray(modelType)) {
|
|
|
|
options = modelType[1];
|
|
|
|
modelType = modelType[0];
|
|
|
|
}
|
|
|
|
if (WORKER) {
|
|
|
|
contexts[name] = this;
|
|
|
|
WORKER.postMessage({
|
|
|
|
type: modelType,
|
|
|
|
name: name,
|
|
|
|
eventType: "create",
|
|
|
|
options: options,
|
|
|
|
watches: BI.map(this.watch, function (key) {
|
|
|
|
return key;
|
|
|
|
})
|
|
|
|
});
|
|
|
|
var store = {};
|
|
|
|
this.store = new Proxy(store, {
|
|
|
|
get (target, key) {
|
|
|
|
return function () {
|
|
|
|
WORKER.postMessage({
|
|
|
|
type: modelType,
|
|
|
|
name: name,
|
|
|
|
eventType: "action",
|
|
|
|
action: key,
|
|
|
|
args: [].slice.call(arguments)
|
|
|
|
});
|
|
|
|
};
|
|
|
|
},
|
|
|
|
set (target, key, value) {
|
|
|
|
return Reflect.set(target, key, value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return function () {
|
|
|
|
delete contexts[name];
|
|
|
|
WORKER.postMessage({
|
|
|
|
type: modelType,
|
|
|
|
name: name,
|
|
|
|
eventType: "destroy"
|
|
|
|
});
|
|
|
|
};
|
|
|
|
} else {
|
|
|
|
this.store = BI.Models.getModel(modelType, options);
|
|
|
|
this.store && (this.store._widget = this);
|
|
|
|
if (this.store instanceof Fix.Model) {
|
|
|
|
this.model = this.store.model;
|
|
|
|
} else {
|
|
|
|
this.model = this.store;
|
|
|
|
}
|
|
|
|
initWatch(this, this.watch);
|
|
|
|
return function () {
|
|
|
|
this.store && BI.isFunction(this.store.destroy) && this.store.destroy();
|
|
|
|
BI.each(this._watchers, function (i, unwatches) {
|
|
|
|
unwatches = BI.isArray(unwatches) ? unwatches : [unwatches];
|
|
|
|
BI.each(unwatches, function (j, unwatch) {
|
|
|
|
unwatch();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
this._watchers && (this._watchers = []);
|
|
|
|
if (this.store) {
|
|
|
|
this.store._parent && (this.store._parent = null);
|
|
|
|
this.store._widget && (this.store._widget = null);
|
|
|
|
this.store = null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function initWatch (vm, watch) {
|
|
|
|
vm._watchers || (vm._watchers = []);
|
|
|
|
for (var key in watch) {
|
|
|
|
var handler = watch[key];
|
|
|
|
if (BI.isArray(handler)) {
|
|
|
|
for (var i = 0; i < handler.length; i++) {
|
|
|
|
vm._watchers.push(createWatcher(vm, key, handler[i]));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
vm._watchers.push(createWatcher(vm, key, handler));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function createWatcher (vm, keyOrFn, cb, options) {
|
|
|
|
if (BI.isPlainObject(cb)) {
|
|
|
|
options = cb;
|
|
|
|
cb = cb.handler;
|
|
|
|
}
|
|
|
|
options = options || {};
|
|
|
|
return Fix.watch(vm.model, keyOrFn, _.bind(cb, vm), BI.extend(options, {
|
|
|
|
store: vm.store
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}());
|