dataModel.js 4.77 KB
define('dataModel', ['components/common', 'Mobilemode_trace'], function (common, trace) {
    var store = common.store;

    var Queues = {
        push: function(dataName, request) {
            var req = Queues[dataName];

            if(req) return req;

            return Queues[dataName] = request().then(function(data) {
                Queues.pop(dataName);
                return data;
            });
        },
        pop: function(dataName) {
            delete Queues[dataName];
        }
    } 

    var dataModel = {
        appid: store.get("appid"),
        appHomepageId: (function() {
            var pageHistory = trace.get('pageHistory'),
                appHomepageId = store.get('appHomepageId'),
                appid = store.get('appid');

            store.remove('appHomepageId');
            store.remove("appid");

            if(!pageHistory) return appHomepageId;
            return pageHistory[appid] || appHomepageId;
        }()),
        appHomepageName: "",
        navsModel: {
            data: null,
            /**
             * @return status: 0|1, data: {
             *     apphomepage_items 自定义页面
             *     list_items 公共查询列表 
             *     nav_items 所有页面
             *     new_layoutpages 新建布局
             * }
             */
            get: function () {
                var that = this;

                return common.api('designer', {
                    action: "getNavPanelData",
                    type: "get",
                    data: { appid: dataModel.appid }
                }).then(function(res) {
                    var data = res.data;

                    that.data = data;
                    return data;
                });
            }
        },
        appHomepageInfo: {
            data: null,
            /**
             * @param appid - 应用id
             * @param appHomepageId - 页面id
             * @return status: 0|1, data: {
             *     appid  应用id
             *     content 页面内容
             *     id  页面id
             *     mecJsonArr 页面插件信息
             *     pageAtrr 页面属性
             * }
             */
            get: function () {
                var that = this;

                return common.api('designer', {
                    action: "getAppHomepageInfo",
                    type: "get",
                    data: { 
                        "appid": dataModel.appid,
                        "appHomepageId": dataModel.appHomepageId
                    }
                }).then(function (result) {
                    var data = result.data || {};

                    that.data = data;
                    dataModel.appid = data.appid;
                    dataModel.appHomepageId = data.id;

                    return result.data;
                });
            },

        },
        fieldOptions: {
            data: {
                set: function(fields){
                    this[fields.formid] = fields.options;
                },
                get: function(formid){
                    return this[formid];
                }
            },
        }
    };
    return {
        /**
         * @param dataName - 数据名称 (必填)
         * @param args - 请求参数
         * @param sync - 同步获取, 需要确保请求完成的情况下
         */
        get: function (dataName, args, sync) {
            var model = dataModel[dataName], data;

            // 非对象类型的数据 如: appid appHomepageid 等
            if (!common.isObject(model)) return model;

            // 当请求没有参数 且需要同步获取时, 交换参数
            if (common.isBoolean(args)) sync = args;

            data = model.data;
            // 同步获取数据 需确保对象已经加载完毕
            if (data && sync) return data;

            // 在不确定对象是否获取成功,但实际已经获取的情况 返回一个Promise对象
            if (data) return $.Deferred().resolve(data);

            // 当发起多个请求时, 以某一次为主, 忽略参数是否相同
            return Queues.push(dataName, function() {
                return model.get.apply(model, args);
            });
        },

        /**
         * @param dataName - 数据名称 (必填)
         * @param Array args - 当model为object时,为请求参数, 否则为value (必填)
         * @param Function hanlder 请求成功后的回调函数 (可选)
         */
        update: function (dataName, args) {
            var model = dataModel[dataName];

            if (!common.isObject(model)) {
                return (dataModel[dataName] = args);
            }

            model.data = null;

            return Queues.push(dataName, function() {
                return model.get.apply(model, args);
            });
        }
    }
});