behavior.js 1.3 KB
function setAsync(context, data) {
    return new Promise(resolve => {
        context.setData(data, resolve);
    });
}
export const behavior = Behavior({
    created() {
        if (!this.$options) {
            return;
        }
        const cache = {};
        const { computed } = this.$options();
        const keys = Object.keys(computed);
        this.calcComputed = () => {
            const needUpdate = {};
            keys.forEach(key => {
                const value = computed[key].call(this);
                if (cache[key] !== value) {
                    cache[key] = value;
                    needUpdate[key] = value;
                }
            });
            return needUpdate;
        };
    },
    attached() {
        this.set();
    },
    methods: {
        // set data and set computed data
        set(data, callback) {
            const stack = [];
            if (data) {
                stack.push(setAsync(this, data));
            }
            if (this.calcComputed) {
                stack.push(setAsync(this, this.calcComputed()));
            }
            return Promise.all(stack).then(res => {
                if (callback && typeof callback === 'function') {
                    callback.call(this);
                }
                return res;
            });
        }
    }
});