MainData仿Backbone Model式 数据模型记录器

MainData仿Backbone Model式 数据模型记录器
主要思想:将 数据记录处理 和 因为数据变化而产生的页面渲染 两者解耦, 让页面元素可以与数据进行关联绑定,杜绝因为遗忘或是逻辑复杂导致的“页面展现与数据不符”现象。同时能更容易地解决大型页面的开发难题。未来还可用于解决多个页面间数据同步困难的难题

/**
 * 使用方式:数据变化时,调用MainData.set方法来改变内存中的数据。在外部,通过MainData.change方法来监听数据变化,并在回调函数中执行页面渲染。
 *
 * API:
 * set(key, value, *silent) 设置一个数据,silent为true则不会触发回调
 * get(key) 获取一个数据的值
 * change(key, callback) 监听一个数据,若该数据发生变化,则调用callback
 */
var MainData = (function() {
    var _attrs = {},
        _changeListeners = {},
        callChange = function(attr, nValue, oValue) {
            if (_changeListeners[attr]) {
                for (var i = 0, l = _changeListeners[attr].length; i < l; i++) {
                    _changeListeners[attr][i].call && _changeListeners[attr][i].call(this, nValue, oValue)
                }
            }
        };

    return {
        set: function(obj, arg, silent) {
            if (arg != void 0) {
                obj = new (function() {
                    this[obj] = arg
                })
            }
            for (var i in obj) {
                if (obj.hasOwnProperty(i)) {
                    silent || callChange(i, obj[i], _attrs[i]);
                    _attrs[i] = obj[i]
                }
            }
        },
        get: function(attr) {
            return _attrs[attr]
        },
        change: function(attr, callback) {
            if (typeof attr != 'string' || typeof callback != 'function')
                throw ('argument error: function change(attr:string, callback:function)');
            (_changeListeners[attr] || (_changeListeners[attr] = [])).push(callback)
        }
    }
})();
原文地址:https://www.cnblogs.com/fengyuqing/p/maindata.html