guy
7 years ago
20 changed files with 16290 additions and 22812 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -1,86 +0,0 @@
|
||||
/** |
||||
* |
||||
* @class BI.FloatBoxRouter |
||||
* @extends BI.WRouter |
||||
*/ |
||||
BI.FloatBoxRouter = BI.inherit(BI.WRouter, { |
||||
routes: {}, |
||||
|
||||
_init: function () { |
||||
this.store = {}; |
||||
this.views = {}; |
||||
}, |
||||
|
||||
createView: function (url, modelData, viewData, context) { |
||||
return BI.Factory.createView(url, this.get(url), modelData || {}, viewData || {}, context) |
||||
}, |
||||
|
||||
open: function (url, modelData, viewData, context, options) { |
||||
var self = this, isValid = BI.isKey(modelData); |
||||
options || (options = {}); |
||||
url = context.rootURL + "/" + url; |
||||
var data = void 0; |
||||
if (isValid) { |
||||
modelData = modelData + "";//避免modelData是数字
|
||||
var keys = modelData.split('.'); |
||||
BI.each(keys, function (i, k) { |
||||
if (i === 0) { |
||||
data = context.model.get(k) || {}; |
||||
} else { |
||||
data = data[k] || {}; |
||||
} |
||||
}); |
||||
data.id = options.id || keys[keys.length - 1]; |
||||
} else { |
||||
data = modelData; |
||||
} |
||||
BI.extend(data, options.data); |
||||
if (!this.controller) { |
||||
this.controller = new BI.FloatBoxController(); |
||||
} |
||||
if (!this.store[url]) { |
||||
this.store[url] = BI.createWidget({ |
||||
type: "bi.float_box" |
||||
}, options); |
||||
var view = this.createView(url, data, viewData, context); |
||||
isValid && context.model.addChild(modelData, view.model); |
||||
view.listenTo(view.model, "destroy", function () { |
||||
self.remove(url, context); |
||||
}); |
||||
context.on(BI.Events.UNMOUNT, function () { |
||||
self.remove(url, context); |
||||
}); |
||||
this.store[url].populate(view); |
||||
this.views[url] = view; |
||||
this.controller.add(url, this.store[url]); |
||||
context && context.on("end:" + view.cid, function () { |
||||
BI.nextTick(function () { |
||||
self.close(url); |
||||
// view.end();
|
||||
(context.listenEnd.apply(context, isValid ? modelData.split('.') : [modelData]) !== false) && context.populate(); |
||||
}, 30) |
||||
}).on("change:" + view.cid, _.bind(context.notifyParent, context)) |
||||
} |
||||
this.controller.open(url); |
||||
this.views[url].populate(data, options.force || true); |
||||
return this; |
||||
}, |
||||
|
||||
close: function (url) { |
||||
if (this.controller) { |
||||
this.controller.close(url); |
||||
} |
||||
return this; |
||||
}, |
||||
|
||||
remove: function (url, context) { |
||||
url = context.rootURL + "/" + url; |
||||
if (this.controller) { |
||||
this.controller.remove(url); |
||||
delete this.store[url]; |
||||
this.views[url] && this.views[url].model.destroy(); |
||||
delete this.views[url]; |
||||
} |
||||
return this; |
||||
} |
||||
}); |
@ -1,38 +0,0 @@
|
||||
/** |
||||
* 统一绑定事件 |
||||
* @type {*|void|Object} |
||||
*/ |
||||
BI.EventList = BI.inherit(BI.OB, { |
||||
_defaultConfig: function() { |
||||
return BI.extend(BI.EventList.superclass._defaultConfig.apply(this, arguments), { |
||||
event: "click", |
||||
callback: BI.emptyFn, |
||||
handle: "", |
||||
items:[] |
||||
}); |
||||
}, |
||||
|
||||
_init : function() { |
||||
BI.EventList.superclass._init.apply(this, arguments); |
||||
this.populate(this.options.items); |
||||
}, |
||||
|
||||
_getHandle: function(item){ |
||||
var handle = this.options.handle ? _.result(item, this.options.handle) : item; |
||||
return handle.element || handle; |
||||
}, |
||||
|
||||
populate: function(items){ |
||||
var self = this, |
||||
event = this.options.event, |
||||
callback = this.options.callback; |
||||
BI.nextTick(function(){ |
||||
BI.each(items, function(i, item){ |
||||
var fn = callback(item); |
||||
BI.isFunction(fn) && (fn = BI.debounce(fn, BI.EVENT_RESPONSE_TIME, true)); |
||||
self._getHandle(item)[event](fn); |
||||
}) |
||||
}) |
||||
|
||||
} |
||||
}); |
@ -1,36 +0,0 @@
|
||||
/** |
||||
* 统一监听jquery事件 |
||||
* @type {*|void|Object} |
||||
*/ |
||||
BI.ListenerList = BI.inherit(BI.OB, { |
||||
_defaultConfig: function() { |
||||
return BI.extend(BI.ListenerList.superclass._defaultConfig.apply(this, arguments), { |
||||
event: "click", |
||||
callback: BI.emptyFn, |
||||
items:[] |
||||
}); |
||||
}, |
||||
|
||||
_init : function() { |
||||
BI.ListenerList.superclass._init.apply(this, arguments); |
||||
this.populate(this.options.items); |
||||
}, |
||||
|
||||
_getHandle: function(item){ |
||||
var handle = this.options.handle ? _.result(item, this.options.handle) : item; |
||||
return handle.element || handle; |
||||
}, |
||||
|
||||
populate: function(items){ |
||||
var self = this, |
||||
event = this.options.event, |
||||
callback = this.options.callback; |
||||
BI.nextTick(function(){ |
||||
BI.each(items, function(i, item){ |
||||
var fn = callback(item); |
||||
BI.isFunction(fn) && (fn = BI.debounce(fn, BI.EVENT_RESPONSE_TIME, true)); |
||||
self._getHandle(item).on(event, fn); |
||||
}) |
||||
}) |
||||
} |
||||
}); |
@ -1,33 +0,0 @@
|
||||
/** |
||||
* Created by GUY on 2015/6/25. |
||||
*/ |
||||
/** |
||||
* 统一监听jquery事件 |
||||
* @type {*|void|Object} |
||||
*/ |
||||
BI.OffList = BI.inherit(BI.OB, { |
||||
_defaultConfig: function() { |
||||
return BI.extend(BI.OffList.superclass._defaultConfig.apply(this, arguments), { |
||||
event: "click", |
||||
items:[] |
||||
}); |
||||
}, |
||||
|
||||
_init : function() { |
||||
BI.OffList.superclass._init.apply(this, arguments); |
||||
this.populate(this.options.items); |
||||
}, |
||||
|
||||
_getHandle: function(item){ |
||||
var handle = this.options.handle ? _.result(item, this.options.handle) : item; |
||||
return handle.element || handle; |
||||
}, |
||||
|
||||
populate: function(items){ |
||||
var self = this, |
||||
event = this.options.event; |
||||
BI.each(items, function(i, item){ |
||||
self._getHandle(item).off(event); |
||||
}) |
||||
} |
||||
}); |
@ -1,518 +0,0 @@
|
||||
BI.Model = BI.inherit(BI.M, { |
||||
props: {}, |
||||
init: null, |
||||
destroyed: null, |
||||
|
||||
_defaultConfig: function () { |
||||
return BI.extend({ |
||||
"default": "just a default", |
||||
"current": void 0 |
||||
}, this.props) |
||||
}, |
||||
|
||||
_static: function () { |
||||
return {}; |
||||
}, |
||||
|
||||
_init: function () { |
||||
BI.Model.superclass._init.apply(this, arguments); |
||||
this.on("change:current", function (obj, val) { |
||||
BI.isNotNull(val) && this.refresh(val); |
||||
}).on("change", function (changed, prev, context, options) { |
||||
if (this._start === true || BI.has(changed, "current")) { |
||||
return; |
||||
} |
||||
this.actionStart(); |
||||
if (!this.local()) { |
||||
!BI.has(this._tmp, BI.keys(changed)) && this.parent && this.parent._change(this); |
||||
this._changing_ = true; |
||||
this.change(changed, prev, context, options); |
||||
this._changing_ = false; |
||||
} |
||||
}); |
||||
|
||||
this._tmp = {};//过渡属性
|
||||
|
||||
this._hass = {}; |
||||
this._gets = [];//记录交互行为
|
||||
this._start = false; |
||||
this._changing_ = false; |
||||
|
||||
this._read = BI.debounce(BI.bind(this.fetch, this), 30); |
||||
this._save = BI.debounce(BI.bind(this.save, this), 30); |
||||
this._F = []; |
||||
this.init && this.init(); |
||||
}, |
||||
|
||||
toJSON: function () { |
||||
var json = BI.Model.superclass.toJSON.apply(this, arguments); |
||||
delete json["baseCls"]; |
||||
delete json["current"]; |
||||
delete json["default"]; |
||||
delete json["parent"]; |
||||
delete json["rootURL"]; |
||||
delete json["id"]; |
||||
delete json["tag"]; |
||||
BI.each(this._gets, function (i, action) { |
||||
delete json[action]; |
||||
}); |
||||
return json; |
||||
}, |
||||
|
||||
copy: function () { |
||||
if (this._start === true || this._changing_ === true) { |
||||
this._F.push({f: this.copy, arg: arguments}); |
||||
return; |
||||
} |
||||
this.trigger("copy"); |
||||
}, |
||||
//子节点的一个类似副本
|
||||
similar: function (value, key1, key2, key3) { |
||||
return value; |
||||
}, |
||||
|
||||
_map: function (child) { |
||||
var self = this; |
||||
var map = {}, current = {}; |
||||
var mapping = function (key, ch) { |
||||
key = key + ""; |
||||
if (key === "") { |
||||
return; |
||||
} |
||||
var keys = key.split('.'); |
||||
if (!map[keys[0]]) { |
||||
map[keys[0]] = self.get(keys[0]); |
||||
} |
||||
var parent = map, last = void 0; |
||||
BI.each(keys, function (i, k) { |
||||
last && (parent = parent[last] || (parent[last] = {})); |
||||
last = k; |
||||
}); |
||||
parent[last] = ch.toJSON(); |
||||
}; |
||||
BI.each(this._childs, function (key, chs) { |
||||
if (!BI.isArray(chs)) { |
||||
chs = [chs]; |
||||
} |
||||
BI.each(chs, function (i, ch) { |
||||
if (ch === child) { |
||||
current[key] = child; |
||||
return; |
||||
} |
||||
//mapping(key, ch);
|
||||
}) |
||||
}); |
||||
BI.each(current, function (key, ch) { |
||||
mapping(key, ch); |
||||
}); |
||||
var tmp = {}; |
||||
BI.each(this._tmp, function (k) { |
||||
if (map[k]) { |
||||
tmp[k] = map[k]; |
||||
delete map[k]; |
||||
} |
||||
}); |
||||
this.tmp(tmp); |
||||
return map; |
||||
}, |
||||
|
||||
_change: function (child) { |
||||
var self = this; |
||||
var childMap = this._map(child); |
||||
//this.set(childMap);
|
||||
var changes = []; |
||||
var changing = this._changing; |
||||
var changed; |
||||
var options = {}; |
||||
this._changing = true; |
||||
if (!changing) { |
||||
this._previousAttributes = _.clone(this.attributes); |
||||
this.changed = {}; |
||||
} |
||||
var current = this.attributes, prev = this._previousAttributes, val; |
||||
for (var attr in childMap) { |
||||
val = childMap[attr]; |
||||
changes.push(attr); |
||||
this.changed[attr] = val; |
||||
current[attr] = val; |
||||
} |
||||
if (changes.length) this._pending = options; |
||||
for (var i = 0, length = changes.length; i < length; i++) { |
||||
this.trigger('change:' + changes[i], this, current[changes[i]], options); |
||||
} |
||||
if (changing) return this; |
||||
changed = BI.clone(this.changed); |
||||
while (this._pending) { |
||||
options = this._pending; |
||||
this._pending = false; |
||||
this.trigger('change', changed, prev, this, options); |
||||
} |
||||
this._pending = false; |
||||
this._changing = false; |
||||
if (changes.length) { |
||||
this.trigger("changed", changed, prev, this, options); |
||||
} |
||||
return this; |
||||
}, |
||||
|
||||
splice: function (old, key1, key2, key3) { |
||||
|
||||
}, |
||||
|
||||
duplicate: function (copy, key1, key2, key3) { |
||||
|
||||
}, |
||||
|
||||
change: function (changed, prev) { |
||||
|
||||
}, |
||||
|
||||
actionStart: function () { |
||||
this._start = true; |
||||
return this; |
||||
}, |
||||
|
||||
actionEnd: function () { |
||||
var self = this; |
||||
this._start = false; |
||||
var _gets = this._gets.slice(0), _F = this._F.slice(0); |
||||
this._gets = []; |
||||
this._hass = {}; |
||||
this._F = []; |
||||
BI.each(_gets, function (i, action) { |
||||
self.unset(action, {silent: true}); |
||||
}); |
||||
BI.each(_F, function (i, fn) { |
||||
fn.f.apply(self, fn.arg); |
||||
}); |
||||
return this; |
||||
}, |
||||
|
||||
addChild: function (name, child) { |
||||
name = name + ""; |
||||
var self = this; |
||||
this._childs || (this._childs = {}); |
||||
if (this._childs[name]) { |
||||
if (BI.isArray(this._childs[name])) { |
||||
this._childs[name].push(child); |
||||
} else { |
||||
this._childs[name] = [this._childs[name]].concat(child) |
||||
} |
||||
} else { |
||||
this._childs[name] = child; |
||||
} |
||||
child && child.on("destroy", function () { |
||||
var keys = name.split('.'); |
||||
var g = self.get(keys[0]), p, c; |
||||
var sset = !!self._tmp[keys[0]] ? "tmp" : "set", unset = "un" + sset; |
||||
|
||||
BI.each(keys, function (i, k) { |
||||
if (i === 0) { |
||||
c = g; |
||||
return; |
||||
} |
||||
p = c; |
||||
c = c[k]; |
||||
}); |
||||
self.removeChild(name, child); |
||||
var newKeys = BI.clone(keys); |
||||
keys.length > 1 ? newKeys.unshift(BI.deepClone(p[keys[keys.length - 1]])) : newKeys.unshift(BI.deepClone(g)); |
||||
keys.length > 1 ? (delete p[keys[keys.length - 1]], self[sset](keys[0], g, {silent: true})) : self[unset](name, {silent: true}); |
||||
!BI.has(self._tmp, keys[0]) && self.parent && self.parent._change(self); |
||||
self.splice.apply(self, newKeys); |
||||
self.trigger("splice", newKeys); |
||||
BI.remove(self._childs, child); |
||||
}).on("copy", function () { |
||||
var keys = name.split('.'); |
||||
var g = self.get(keys[0]), p, c; |
||||
var sset = !!self._tmp[keys[0]] ? "tmp" : "set"; |
||||
BI.each(keys, function (i, k) { |
||||
if (i === 0) { |
||||
c = g; |
||||
return; |
||||
} |
||||
p = c; |
||||
c = c[k]; |
||||
}); |
||||
var copy = BI.UUID(), newKeys = BI.clone(keys); |
||||
keys.length > 1 ? newKeys.unshift(BI.deepClone(p[keys[keys.length - 1]])) : newKeys.unshift(BI.deepClone(g)); |
||||
var backup = self.similar.apply(self, newKeys); |
||||
if (BI.isKey(backup.id)) { |
||||
copy = backup.id; |
||||
delete backup.id; |
||||
} |
||||
keys.length > 1 ? (p[copy] = backup, self[sset](keys[0], g, {silent: true})) : self[sset](copy, backup, {silent: true}); |
||||
keys.unshift(copy); |
||||
!BI.has(self._tmp, keys[0]) && self.parent && self.parent._change(self); |
||||
self.duplicate.apply(self, keys); |
||||
self.trigger("duplicate", keys); |
||||
}); |
||||
}, |
||||
|
||||
removeChild: function (name, child) { |
||||
if (BI.isArray(this._childs[name])) { |
||||
BI.remove(this._childs[name], child); |
||||
if (BI.isEmpty(this._childs[name])) { |
||||
delete this._childs[name]; |
||||
} |
||||
return; |
||||
} |
||||
delete this._childs[name]; |
||||
}, |
||||
|
||||
has: function (attr, istemp) { |
||||
if (istemp === true) { |
||||
return _.has(this.tmp, attr); |
||||
} |
||||
if (this._start === true && this._changing_ === false) { |
||||
this._hass[attr] = true; |
||||
} |
||||
return BI.Model.superclass.has.apply(this, arguments); |
||||
}, |
||||
|
||||
cat: function (attr) { |
||||
if (_.has(this._tmp, attr)) { |
||||
return this._tmp[attr]; |
||||
} |
||||
if (this._start === true && this._hass[attr]) { |
||||
delete this._hass[attr]; |
||||
switch (attr) { |
||||
case "default": |
||||
break; |
||||
case "current": |
||||
break; |
||||
default : |
||||
this._gets.push(attr); |
||||
break; |
||||
} |
||||
} |
||||
if (_.has(this.attributes, attr)) { |
||||
return this.attributes[attr]; |
||||
} |
||||
var sta = _.result(this, "_static"); |
||||
return BI.isFunction(sta[attr]) ? sta[attr].apply(this, Array.prototype.slice.apply(arguments, [1])) : sta[attr]; |
||||
}, |
||||
|
||||
get: function () { |
||||
return BI.deepClone(this.cat.apply(this, arguments)); |
||||
}, |
||||
|
||||
set: function (key, val, options) { |
||||
if (this._start === true || this._changing_ === true) { |
||||
this._F.push({f: this.set, arg: arguments}); |
||||
return this; |
||||
} |
||||
return BI.Model.superclass.set.apply(this, arguments); |
||||
}, |
||||
|
||||
unset: function (attr, options) { |
||||
var self = this; |
||||
BI.each(this._childs, function (key, model) { |
||||
key = key + ""; |
||||
var keys = key.split('.'); |
||||
if (_.isEqual(attr, keys[0])) { |
||||
delete self._childs[attr]; |
||||
if (!BI.isArray(model)) { |
||||
model = [model]; |
||||
} |
||||
BI.each(model, function (i, m) { |
||||
m.trigger("unset"); |
||||
}); |
||||
} |
||||
}); |
||||
return BI.Model.superclass.unset.apply(this, arguments); |
||||
}, |
||||
|
||||
tmp: function (key, val, options) { |
||||
if (this._start === true || this._changing_ === true) { |
||||
this._F.push({f: this.tmp, arg: arguments}); |
||||
return this; |
||||
} |
||||
var attr, attrs, unset, changes, silent, changing, changed, prev, current; |
||||
if (key == null) return this; |
||||
if (typeof key === 'object') { |
||||
attrs = key; |
||||
options = val; |
||||
} else { |
||||
(attrs = {})[key] = val; |
||||
} |
||||
options || (options = {}); |
||||
|
||||
unset = options.unset; |
||||
silent = options.silent; |
||||
changes = []; |
||||
changing = this._changingTmp; |
||||
this._changingTmp = true; |
||||
|
||||
if (!changing) { |
||||
this._previousTmp = _.clone(this._tmp); |
||||
this.changedTmp = {}; |
||||
} |
||||
if (!this._previousTmp) { |
||||
this._previousTmp = _.clone(this._tmp); |
||||
} |
||||
current = this._tmp, prev = this._previousTmp; |
||||
|
||||
for (attr in attrs) { |
||||
val = attrs[attr]; |
||||
if (!_.isEqual(current[attr], val)) changes.push(attr); |
||||
if (!_.isEqual(prev[attr], val)) { |
||||
this.changedTmp[attr] = val; |
||||
} else { |
||||
delete this.changedTmp[attr]; |
||||
} |
||||
unset ? delete current[attr] : current[attr] = val; |
||||
} |
||||
|
||||
if (!silent) { |
||||
if (changes.length) this._pendingTmp = options; |
||||
for (var i = 0, length = changes.length; i < length; i++) { |
||||
this.trigger('change:' + changes[i], this, current[changes[i]], options); |
||||
} |
||||
} |
||||
|
||||
if (changing) return this; |
||||
changed = BI.clone(this.changedTmp); |
||||
if (!silent) { |
||||
while (this._pendingTmp) { |
||||
options = this._pendingTmp; |
||||
this._pendingTmp = false; |
||||
this.trigger('change', changed, prev, this, options); |
||||
} |
||||
} |
||||
this._pendingTmp = false; |
||||
this._changingTmp = false; |
||||
if (!silent && changes.length) this.trigger("changed", changed, prev, this, options); |
||||
return this; |
||||
}, |
||||
|
||||
untmp: function (attr, options) { |
||||
var self = this; |
||||
BI.each(this._childs, function (key, model) { |
||||
key = key + ""; |
||||
var keys = key.split('.'); |
||||
if (_.isEqual(attr, keys[0])) { |
||||
delete self._childs[attr]; |
||||
if (!BI.isArray(model)) { |
||||
model = [model]; |
||||
} |
||||
BI.each(model, function (i, m) { |
||||
m.trigger("unset"); |
||||
}); |
||||
} |
||||
}); |
||||
return this.tmp(attr, void 0, _.extend({}, options, {unset: true})); |
||||
}, |
||||
|
||||
cancel: function (options) { |
||||
var self = this; |
||||
var tmp = BI.clone(this._tmp); |
||||
this._tmp = {}; |
||||
BI.each(tmp, function (k) { |
||||
self.untmp(k, options); |
||||
}); |
||||
}, |
||||
|
||||
submit: function () { |
||||
var tmp = BI.clone(this._tmp); |
||||
this._tmp = {}; |
||||
this.set(tmp); |
||||
return this; |
||||
}, |
||||
|
||||
urlRoot: function () { |
||||
return BI.servletURL; |
||||
}, |
||||
|
||||
parse: function (data) { |
||||
return data; |
||||
}, |
||||
|
||||
setEditing: function (edit) { |
||||
this._editing = edit; |
||||
}, |
||||
|
||||
getEditing: function () { |
||||
if (this._start !== true) { |
||||
throw new Error("getEditing函数只允许在local中调用"); |
||||
} |
||||
return this._editing; |
||||
}, |
||||
|
||||
local: function () { |
||||
|
||||
}, |
||||
|
||||
load: function (data) { |
||||
|
||||
}, |
||||
|
||||
refresh: function () { |
||||
|
||||
}, |
||||
|
||||
/** |
||||
* 更新整个model |
||||
*/ |
||||
updateURL: function () { |
||||
|
||||
}, |
||||
/** |
||||
* 添加一个元素或删除一个元素或修改一个元素 |
||||
*/ |
||||
patchURL: function () { |
||||
|
||||
}, |
||||
/** |
||||
* 删除整个model, destroy方法调用 |
||||
*/ |
||||
deleteURL: function () { |
||||
|
||||
}, |
||||
/** |
||||
* 读取model |
||||
*/ |
||||
readURL: function () { |
||||
|
||||
}, |
||||
|
||||
read: function (options) { |
||||
if (this._start == true || this._changing_ === true) { |
||||
this._F.push({f: this.read, arg: arguments}); |
||||
return; |
||||
} |
||||
this._read(options); |
||||
}, |
||||
|
||||
update: function (options) { |
||||
if (this._start == true || this._changing_ === true) { |
||||
this._F.push({f: this.update, arg: arguments}); |
||||
return; |
||||
} |
||||
this._save(null, options); |
||||
}, |
||||
|
||||
patch: function (options) { |
||||
if (this._start == true || this._changing_ === true) { |
||||
this._F.push({f: this.patch, arg: arguments}); |
||||
return; |
||||
} |
||||
this._save(null, BI.extend({}, options, { |
||||
patch: true |
||||
})); |
||||
}, |
||||
|
||||
_destroy: function () { |
||||
var children = BI.extend({}, this._childs); |
||||
this._childs = {}; |
||||
BI.each(children, function (i, child) { |
||||
child._destroy(); |
||||
}); |
||||
this.destroyed && this.destroyed(); |
||||
}, |
||||
|
||||
destroy: function () { |
||||
this._destroy(); |
||||
BI.Model.superclass.destroy.apply(this, arguments); |
||||
} |
||||
}); |
@ -1,44 +0,0 @@
|
||||
/** |
||||
* MVC工厂 |
||||
* guy |
||||
* @class BI.Factory |
||||
*/ |
||||
BI.Factory = { |
||||
parsePath: function parsePath (path) { |
||||
var segments = path.split('.'); |
||||
return function (obj) { |
||||
for (var i = 0; i < segments.length; i++) { |
||||
if (!obj) { |
||||
return; |
||||
} |
||||
obj = obj[segments[i]]; |
||||
} |
||||
return obj; |
||||
} |
||||
}, |
||||
createView : function(url, viewFunc, mData, vData, context){ |
||||
var modelFunc = viewFunc.replace(/View/, "Model"); |
||||
modelFunc = this.parsePath(modelFunc)(window); |
||||
if(!_.isFunction(modelFunc)){ |
||||
modelFunc = BI.Model; |
||||
} |
||||
// try {
|
||||
var model = new (modelFunc)(_.extend({}, mData, { |
||||
parent: context && context.model, |
||||
rootURL: url |
||||
}), {silent: true}); |
||||
// } catch (e) {
|
||||
//
|
||||
// }
|
||||
// try {
|
||||
var view = new (this.parsePath(viewFunc)(window))(_.extend({}, vData, { |
||||
model: model, |
||||
parent: context, |
||||
rootURL: url |
||||
})); |
||||
// } catch (e) {
|
||||
//
|
||||
// }
|
||||
return view; |
||||
} |
||||
}; |
@ -1,48 +0,0 @@
|
||||
/** |
||||
* MVC路由 |
||||
* @class BI.WRouter |
||||
* @extends BI.Router |
||||
* @type {*|void|Object} |
||||
*/ |
||||
BI.WRouter = BI.Router.extend({ |
||||
add: function(route, callback){ |
||||
this.handlers || (this.handlers=[]); |
||||
this.handlers.unshift({route: route, callback: callback}) |
||||
}, |
||||
|
||||
route: function(route, name, callback) { |
||||
if (!_.isRegExp(route)) route = this._routeToRegExp(route); |
||||
if (_.isFunction(name)) { |
||||
callback = name; |
||||
name = ''; |
||||
} |
||||
if (!callback) callback = this[name]; |
||||
var self = this; |
||||
this.add(route, function(fragment) { |
||||
var args = self._extractParameters(route, fragment); |
||||
var result = self.execute(callback, args, name) |
||||
if (result !== false) { |
||||
self.trigger.apply(self, ['route:' + name].concat(args)); |
||||
self.trigger('route', name, args); |
||||
} |
||||
return result; |
||||
}); |
||||
return this; |
||||
}, |
||||
|
||||
execute: function(callback, args, name) { |
||||
if (callback) return callback.apply(this, args); |
||||
return name; |
||||
}, |
||||
|
||||
get: function(fragment){ |
||||
var result = null; |
||||
_.any(this.handlers, function(handler) { |
||||
if (handler.route.test(fragment)) { |
||||
result = handler.callback(fragment); |
||||
return true; |
||||
} |
||||
}); |
||||
return result; |
||||
} |
||||
}); |
@ -1,536 +0,0 @@
|
||||
/** |
||||
* @class BI.View |
||||
* @extends BI.V |
||||
* @type {*|void|Object} |
||||
*/ |
||||
BI.View = BI.inherit(BI.V, { |
||||
|
||||
//生命周期函数
|
||||
beforeCreate: null, |
||||
|
||||
created: null, |
||||
|
||||
beforeDestroy: null, |
||||
|
||||
destroyed: null, |
||||
|
||||
_init: function () { |
||||
BI.View.superclass._init.apply(this, arguments); |
||||
this.beforeCreate && this.beforeCreate(); |
||||
var self = this; |
||||
this.listenTo(this.model, "change:current", function (obj, val) { |
||||
if (BI.isNotNull(val) && val.length > 0) { |
||||
this.refresh(val); |
||||
} |
||||
}).listenTo(this.model, "change", function (changed) { |
||||
this.delegateEvents(); |
||||
}).listenTo(this.model, "changed", function (changed, prev, context, options) { |
||||
if (BI.has(changed, "current") && BI.size(changed) > 1) { |
||||
throw new Error("refresh操作不能调用set操作"); |
||||
} |
||||
var notLocal = !BI.has(changed, "current") && !this.local() && this.notifyParent().notify(); |
||||
this.model.actionEnd() && this.actionEnd(); |
||||
this.model._changing_ = true; |
||||
notLocal && !BI.isEmpty(changed) && this.change(changed, prev, context, options); |
||||
this.model._changing_ = false; |
||||
this.model.actionEnd() && this.actionEnd(); |
||||
}).listenTo(this.model, "destroy", function () { |
||||
this._destroy(); |
||||
}).listenTo(this.model, "unset", function () { |
||||
this._destroy(); |
||||
}).listenTo(this.model, "splice", function (arg) { |
||||
this.splice.apply(this, arg); |
||||
}).listenTo(this.model, "duplicate", function (arg) { |
||||
this.duplicate.apply(this, arg); |
||||
}); |
||||
this._F = []; |
||||
var flatten = ["_init", "_defaultConfig", "_vessel", "_render", "getName", "listenEnd", "local", "refresh", "load", "change"]; |
||||
flatten = BI.makeObject(flatten, true); |
||||
BI.each(this.constructor.caller.caller.prototype, function (key) { |
||||
if (flatten[key]) { |
||||
return; |
||||
} |
||||
var f = self[key]; |
||||
if (BI.isFunction(f)) { |
||||
self[key] = BI.bind(function () { |
||||
if (this.model._start === true) { |
||||
this._F.push({f: f, arg: arguments}); |
||||
return; |
||||
} |
||||
return f.apply(this, arguments); |
||||
}, self); |
||||
} |
||||
}); |
||||
this.created && this.created(); |
||||
}, |
||||
|
||||
change: function (changed, prev) { |
||||
|
||||
}, |
||||
|
||||
actionEnd: function () { |
||||
var self = this; |
||||
var _F = this._F.slice(0); |
||||
this._F = []; |
||||
BI.each(_F, function (i, f) { |
||||
f.f.apply(self, f.arg); |
||||
}); |
||||
return this; |
||||
}, |
||||
|
||||
delegateEvents: function (events) { |
||||
if (!(events || (events = BI.deepClone(_.result(this, 'events'))))) return this; |
||||
var delegateEventSplitter = /^(\S+)\s*(.*)$/; |
||||
for (var key in events) { |
||||
var method = events[key]; |
||||
if (!_.isFunction(method)) method = this[events[key]]; |
||||
if (!method) continue; |
||||
var match = key.match(delegateEventSplitter); |
||||
var ev = true; |
||||
switch (match[1]) { |
||||
case "draggable": |
||||
break; |
||||
case "droppable": |
||||
break; |
||||
case "sortable": |
||||
break; |
||||
case "resizable": |
||||
break; |
||||
case "hover": |
||||
break; |
||||
default : |
||||
ev = false; |
||||
break; |
||||
} |
||||
|
||||
var off = new BI.OffList({ |
||||
event: match[1] + '.delegateEvents' + this.cid |
||||
}); |
||||
|
||||
var keys = match[2].split('.'); |
||||
var handle = keys[1]; |
||||
var bind = ev ? new BI.EventList({ |
||||
event: match[1], |
||||
handle: handle, |
||||
callback: BI.bind(method, this) |
||||
}) : new BI.ListenerList({ |
||||
event: match[1] + '.delegateEvents' + this.cid, |
||||
handle: handle, |
||||
callback: BI.bind(method, this), |
||||
context: this |
||||
}); |
||||
|
||||
var list = []; |
||||
if (this[keys[0]] && (this[keys[0]] instanceof $ || this[keys[0]].element instanceof $)) { |
||||
list = [this[keys[0]]] |
||||
delete events[key]; |
||||
} else if (BI.isArray(this[keys[0]]) || BI.isPlainObject(this[keys[0]])) { |
||||
list = this[keys[0]] |
||||
delete events[key]; |
||||
} |
||||
off.populate(list); |
||||
bind.populate(list); |
||||
} |
||||
return BI.View.superclass.delegateEvents.apply(this, [events]); |
||||
}, |
||||
|
||||
_vessel: function () { |
||||
this._cardLayouts = {}; |
||||
this._cardLayouts[this.getName()] = new BI.CardLayout({ |
||||
element: this |
||||
}); |
||||
var vessel = BI.createWidget(); |
||||
this._cardLayouts[this.getName()].addCardByName(this.getName(), vessel); |
||||
return vessel; |
||||
}, |
||||
|
||||
render: function (vessel) { |
||||
return this; |
||||
}, |
||||
|
||||
/** |
||||
* 创建儿子所在容器 |
||||
* @param key |
||||
* @param vessel |
||||
* @param options isLayer:是否是弹出层, defaultShowName:默认显示项 |
||||
* @returns {BI.View} |
||||
*/ |
||||
addSubVessel: function (key, vessel, options) { |
||||
options || (options = {}); |
||||
this._cardLayouts || (this._cardLayouts = {}); |
||||
var id = key + this.cid; |
||||
options.isLayer && (vessel = BI.Layers.has(id) ? BI.Layers.get(id) : BI.Layers.create(id, vessel)); |
||||
if (this._cardLayouts[key]) { |
||||
options.defaultShowName && this._cardLayouts[key].setDefaultShowName(options.defaultShowName); |
||||
return this; |
||||
} |
||||
this._cardLayouts[key] = BI.createWidget({ |
||||
type: "bi.card", |
||||
element: vessel, |
||||
defaultShowName: options.defaultShowName |
||||
}); |
||||
return this; |
||||
}, |
||||
|
||||
removeSubVessel: function (key) { |
||||
var self = this, id = key + this.cid; |
||||
BI.Layers.remove(id); |
||||
var cardNames = this._cardLayouts[key] && this._cardLayouts[key].getAllCardNames(); |
||||
BI.each(cardNames, function (i, name) { |
||||
delete self._cards[name]; |
||||
}); |
||||
this._cardLayouts[key] && this._cardLayouts[key]._destroy(); |
||||
return this; |
||||
}, |
||||
|
||||
createView: function (url, modelData, viewData, context) { |
||||
return BI.Factory.createView(url, this.get(url), modelData, viewData, context); |
||||
}, |
||||
|
||||
/** |
||||
* 跳转到指定的card |
||||
* @param cardName |
||||
*/ |
||||
skipTo: function (cardName, layout, modelData, viewData, options) { |
||||
if (this.model._start === true || this._changing_ === true) { |
||||
this._F.push({f: this.skipTo, arg: arguments}); |
||||
return this; |
||||
} |
||||
var self = this, isValid = BI.isKey(modelData), data = void 0; |
||||
BI.isKey(layout) && (layout = layout + ""); |
||||
layout = layout || this.getName(); |
||||
options || (options = {}); |
||||
if (isValid) { |
||||
modelData = modelData + "";//避免modelData是数字
|
||||
var keys = modelData.split('.'); |
||||
BI.each(keys, function (i, k) { |
||||
if (i === 0) { |
||||
data = self.model.get(k) || {}; |
||||
} else { |
||||
data = data[k] || {}; |
||||
} |
||||
}); |
||||
data.id = options.id || keys[keys.length - 1]; |
||||
} else { |
||||
data = modelData; |
||||
} |
||||
BI.extend(data, options.data); |
||||
var action = options.action || new BI.ShowAction(); |
||||
var cardLayout = this._cardLayouts[layout]; |
||||
if (!cardLayout) { |
||||
return this; |
||||
} |
||||
cardLayout.setVisible(true); |
||||
if (BI.isKey(cardName) && !cardLayout.isCardExisted(cardName)) { |
||||
var view = this.createView(this.rootURL + "/" + cardName, data, viewData, this); |
||||
isValid && this.model.addChild(modelData, view.model); |
||||
view.listenTo(view.model, "destroy", function () { |
||||
delete self._cards[cardName]; |
||||
cardLayout.deleteCardByName(cardName); |
||||
if (cardLayout.isAllCardHide()) { |
||||
cardLayout.setVisible(false); |
||||
BI.Layers.hide(layout + self.cid); |
||||
} |
||||
}).listenTo(view.model, "unset", function () { |
||||
delete self._cards[cardName]; |
||||
cardLayout.deleteCardByName(cardName); |
||||
}); |
||||
cardLayout.addCardByName(cardName, view); |
||||
this._cards || (this._cards = {}); |
||||
this._cards[cardName] = view; |
||||
data = {}; |
||||
this.on("end:" + view.cid, function () { |
||||
var isNew = false, t, keys; |
||||
if (isValid) { |
||||
keys = modelData.split('.'); |
||||
BI.each(keys, function (i, k) { |
||||
if (i === 0) { |
||||
t = self.model.get(k) || (isNew = true); |
||||
} else { |
||||
t = t[k] || (isNew = true); |
||||
} |
||||
}); |
||||
} |
||||
if (isNew) { |
||||
delete self._cards[cardName]; |
||||
self.model.removeChild(modelData, view.model); |
||||
cardLayout.deleteCardByName(cardName); |
||||
view._destroy(); |
||||
cardLayout.setVisible(false); |
||||
} |
||||
action.actionBack(view, null, function () { |
||||
if (cardLayout.isAllCardHide()) { |
||||
cardLayout.setVisible(false); |
||||
BI.Layers.hide(layout + self.cid); |
||||
} |
||||
!isNew && (self.listenEnd.apply(self, isValid ? keys : [modelData]) !== false) && self.populate(); |
||||
}) |
||||
}).on("change:" + view.cid, _.bind(this.notifyParent, this)); |
||||
} |
||||
BI.isKey(cardName) && BI.Layers.show(layout + this.cid); |
||||
cardLayout.showCardByName(cardName, action, function () { |
||||
BI.isKey(cardName) && self._cards[cardName].populate(data, options); |
||||
}); |
||||
!BI.isKey(cardName) && BI.Layers.hide(layout + this.cid); |
||||
return this._cards[cardName]; |
||||
}, |
||||
|
||||
listenEnd: function (key1, key2, key3) { |
||||
return this; |
||||
}, |
||||
|
||||
/** |
||||
* 告诉父亲我的操作结束了,后面的事情任由父亲处置 |
||||
* @param force 强制下次再次进入该节点时不进行刷新操作, 默认执行刷新 |
||||
* @returns {BI.View} |
||||
*/ |
||||
notifyParentEnd: function (force) { |
||||
this.parent && this.parent.trigger("end:" + this.cid); |
||||
this.trigger("end"); |
||||
!force && this.notify(); |
||||
return this; |
||||
}, |
||||
|
||||
/** |
||||
* 通知父亲我的数据发生了变化 |
||||
*/ |
||||
notifyParent: function () { |
||||
this.parent && this.parent.notify().trigger("change:" + this.cid); |
||||
return this; |
||||
}, |
||||
|
||||
/** |
||||
* 告诉Model数据改变了 |
||||
*/ |
||||
notify: function () { |
||||
this.model.unset("current", {silent: true}); |
||||
return this; |
||||
}, |
||||
|
||||
getName: function () { |
||||
return "VIEW" |
||||
}, |
||||
|
||||
/** |
||||
* 全局刷新 |
||||
* @param current |
||||
*/ |
||||
refresh: function (current) { |
||||
}, |
||||
/** |
||||
* 局部刷新 |
||||
*/ |
||||
local: function () { |
||||
return false; |
||||
}, |
||||
|
||||
load: function (data) { |
||||
|
||||
}, |
||||
|
||||
readData: function (force, options) { |
||||
options || (options = {}); |
||||
var self = this; |
||||
var args = [].slice.call(arguments, 2); |
||||
if (!force && this._readed === true) {//只从后台获取一次数据
|
||||
callback(this.model.toJSON()); |
||||
return; |
||||
} |
||||
//采用静默方式读数据,该数据变化不引起data的change事件触发
|
||||
var success = options.success; |
||||
this.model.read(BI.extend({ |
||||
silent: true |
||||
}, options, { |
||||
success: function (data, model) { |
||||
callback(data); |
||||
!force && (self._readed = true); |
||||
self.delegateEvents(); |
||||
success && success(data, model); |
||||
} |
||||
})); |
||||
|
||||
function callback(data) { |
||||
self.model.load(data); |
||||
self.load(data); |
||||
BI.each(args, function (i, arg) { |
||||
if (BI.isFunction(arg)) { |
||||
arg.apply(self, [data]); |
||||
} |
||||
}) |
||||
} |
||||
}, |
||||
|
||||
//处理model的通用方法
|
||||
cat: function () { |
||||
return this.model.cat.apply(this.model, arguments); |
||||
}, |
||||
|
||||
get: function () { |
||||
return this.model.get.apply(this.model, arguments); |
||||
}, |
||||
|
||||
set: function () { |
||||
return this.model.set.apply(this.model, arguments); |
||||
}, |
||||
|
||||
has: function () { |
||||
return this.model.has.apply(this.model, arguments); |
||||
}, |
||||
|
||||
getEditing: function () { |
||||
return this.model.getEditing(); |
||||
}, |
||||
|
||||
reading: function (options) { |
||||
var self = this; |
||||
var name = BI.UUID(); |
||||
this.model.read(BI.extend({}, options, { |
||||
beforeSend: function () { |
||||
var loading = BI.createWidget({ |
||||
type: 'bi.vertical', |
||||
items: [{ |
||||
type: "bi.layout", |
||||
height: 30, |
||||
cls: "loading-background" |
||||
}], |
||||
element: BI.Maskers.make(name, self) |
||||
}); |
||||
loading.setVisible(true); |
||||
}, |
||||
complete: function (data) { |
||||
options.complete && options.complete(data); |
||||
BI.Maskers.remove(name); |
||||
} |
||||
})); |
||||
}, |
||||
|
||||
updating: function (options) { |
||||
var self = this; |
||||
var name = BI.UUID(); |
||||
this.model.update(BI.extend({}, options, { |
||||
noset: true, |
||||
beforeSend: function () { |
||||
var loading = BI.createWidget({ |
||||
type: 'bi.vertical', |
||||
items: [{ |
||||
type: "bi.layout", |
||||
height: 30, |
||||
cls: "loading-background" |
||||
}], |
||||
element: BI.Maskers.make(name, self) |
||||
}); |
||||
loading.setVisible(true); |
||||
}, |
||||
complete: function (data) { |
||||
options.complete && options.complete(data); |
||||
BI.Maskers.remove(name); |
||||
} |
||||
})); |
||||
}, |
||||
|
||||
patching: function (options) { |
||||
var self = this; |
||||
var name = BI.UUID(); |
||||
this.model.patch(BI.extend({}, options, { |
||||
noset: true, |
||||
beforeSend: function () { |
||||
var loading = BI.createWidget({ |
||||
type: 'bi.vertical', |
||||
items: [{ |
||||
type: "bi.layout", |
||||
height: 30, |
||||
cls: "loading-background" |
||||
}], |
||||
element: BI.Maskers.make(name, self) |
||||
}); |
||||
loading.setVisible(true); |
||||
}, |
||||
complete: function (data) { |
||||
options.complete && options.complete(data); |
||||
BI.Maskers.remove(name); |
||||
} |
||||
})); |
||||
}, |
||||
|
||||
populate: function (modelData, options) { |
||||
var self = this; |
||||
options || (options = {}); |
||||
if (options.force === true) { |
||||
this.notify(); |
||||
} |
||||
if (this._cardLayouts && this._cardLayouts[this.getName()]) { |
||||
this._cardLayouts[this.getName()].showCardByName(this.getName()); |
||||
} |
||||
//BI.each(this._cardLayouts, function (key, layout) {
|
||||
// layout.showCardByName(layout.getDefaultShowName() || self.getName());
|
||||
//});
|
||||
//BI.each(this._cards, function (i, card) {
|
||||
// card.notify && card.notify();
|
||||
//});
|
||||
if (this._F.length > 0) { |
||||
throw new Error("流程错误"); |
||||
} |
||||
if (options.force === true) { |
||||
this.model.set(modelData, options).set({current: this.model.get("default")}); |
||||
return; |
||||
} |
||||
if (options.force === false) { |
||||
this.model.set(modelData); |
||||
return; |
||||
} |
||||
var filter = BI.clone(modelData || {}); |
||||
delete filter.id; |
||||
var contains = BI.has(this.model.toJSON(), _.keys(filter)); |
||||
var match = BI.isEmpty(filter) || (contains && this.model.matches(modelData)); |
||||
if (match === true) { |
||||
this.model.set({current: this.model.get("default")}); |
||||
} else if (contains === false) { |
||||
this.model.set(modelData); |
||||
} else { |
||||
this.model.set(modelData, options).set({current: this.model.get("default")}); |
||||
} |
||||
}, |
||||
|
||||
//删除子节点触发
|
||||
splice: function (old, key1, key2, key3) { |
||||
|
||||
}, |
||||
|
||||
//复制子节点触发
|
||||
duplicate: function (copy, key1, key2, key3) { |
||||
|
||||
}, |
||||
|
||||
_unMount: function () { |
||||
this.beforeDestroy && this.beforeDestroy(); |
||||
BI.each(this._cardLayouts, function (name, card) { |
||||
card && card._unMount(); |
||||
}); |
||||
delete this._cardLayouts; |
||||
delete this._cards; |
||||
this.destroyed && this.destroyed(); |
||||
this.trigger(BI.Events.UNMOUNT); |
||||
this.off(); |
||||
}, |
||||
|
||||
_destroy: function () { |
||||
var self = this; |
||||
BI.each(this._cardLayouts, function (name, card) { |
||||
card && card._unMount(); |
||||
BI.Layers.remove(name + self.cid); |
||||
}); |
||||
delete this._cardLayouts; |
||||
delete this._cards; |
||||
this.destroyed && this.destroyed(); |
||||
this.remove(); |
||||
this.trigger(BI.Events.DESTROY); |
||||
this.off(); |
||||
} |
||||
}); |
||||
|
||||
BI.View.registerVMRouter = function (viewRouter, modelRouter) { |
||||
//配置View
|
||||
BI.View.createView = BI.View.prototype.createView = function (url, modelData, viewData, context) { |
||||
return BI.Factory.createView(url, viewRouter.get(url), _.extend({}, modelRouter.get(url), modelData), viewData || {}, context); |
||||
}; |
||||
}; |
Loading…
Reference in new issue