okam-core
Version:
The extension for small program framework
104 lines (78 loc) • 2.48 kB
JavaScript
/**
* @file Array data update proxy for ant application
* @author sparklewhy@gmail.com
*/
'use strict';
/* eslint-disable fecs-export-on-declare */
const componentApi = {
__spliceData(path, spliceArgs, observer) {
let spliceInfo = {[path]: spliceArgs};
this.$spliceData(spliceInfo, this.__nextTickCallback);
// update the cache raw data
observer.rawData = observer.getContextData();
}
};
const observableArray = {
push(observer, rawPush, ...items) {
let {ctx, selector} = observer;
ctx.__spliceData(selector, [this.length, 0, ...items], observer);
return rawPush.apply(this, items);
},
shift(observer, rawShift) {
let {ctx, selector} = observer;
if (!this.length) {
return rawShift.call(this);
}
ctx.__spliceData(selector, [0, 1], observer);
return rawShift.call(this);
},
unshift(observer, rawUnshift, ...items) {
let {ctx, selector} = observer;
ctx.__spliceData(selector, [0, 0, ...items], observer);
return rawUnshift.apply(this, items);
},
pop(observer, rawPop) {
let {ctx, selector} = observer;
let len = this.length;
if (!len) {
return rawPop.call(this);
}
ctx.__spliceData(selector, [len - 1, 1], observer);
return rawPop.call(this);
},
splice(observer, rawSplice, ...args) {
let {ctx, selector} = observer;
ctx.__spliceData(selector, args, observer);
return rawSplice.apply(this, args);
}
};
Object.keys(observableArray).forEach(k => {
let raw = observableArray[k];
observableArray[k] = function (...args) {
let observer = args[0];
observer.ctx.__dataUpTaskNum++;
let result = raw.apply(this, args);
observer.notifyWatcher(this, this, observer.paths);
return result;
};
});
Object.assign(observableArray, {
sort(observer, rawSort, ...args) {
let rawData = observer.rawData;
rawSort.apply(rawData, args);
let result = rawSort.apply(this, args);
observer.set(null, rawData);
return result;
},
reverse(observer, rawReverse) {
let rawData = observer.rawData;
rawData.reverse();
let result = rawReverse.call(this);
observer.set(null, rawData);
return result;
}
});
export {
observableArray as array,
componentApi as component
};