service_wev8.js 3.53 KB
define("mService", ["mUtil", "mobilebone", "i18n"], function (mUtil, Mobilebone, i18n) {
	var cache = {};
	var namespace = "mService/";
	var services = {
		setService: function (id, service) {
			this[id] = service
		},
		getService: function (id) {
			return this[id];
		}
	};

	function Service(id) {
		var service = services.getService(id);

		if (service) return service;

		var index = id.indexOf("/");
		var cssId = index === -1 ? id : id.substring(0, index);

		this.id = id;
		this.name = namespace + id;
		this.css = "css!" + namespace + cssId + "_css";
		this.html = namespace + id + "_html";
		this.setService = function (service) { // service.js对象
			this.service = service;
		};
		this.setTpl = function (tpl) { // service.html 模板字符串
			this.tpl = tpl;
		};
		services.setService(id, this);
	}

	Service.prototype = {
		load: function (callback) {
			var done = $.Deferred();
			var t = this;

			callback = callback || function () { };

			if (t.tpl) {
				callback(t.tpl, t.service);
				return done.resolve(t.tpl, t.service);
			}

			require([this.name, this.css], function (service) {
				require([t.html], function (tpl) {
					callback(tpl, service);
					done.resolve(tpl, service);
					t.setTpl(tpl);
					t.setService(service);
				});
			});

			return done;
		},
		preload: function () {
			require([this.name, this.css]);
		}
	};

	return {
		show: function (id, cfg) {
			var pageid = "page_service_" + (id.replace("/", "_"));
			var _identity = cfg && cfg["_identity"];

			if (_identity) {
				pageid += "_" + _identity;
            }
            
			var isRerender = true;
            var $pageout = $(".in." + Mobilebone.classPage);
            var clsNameStr = pageid;
            
            if (_identity) {
                clsNameStr = clsNameStr.replace("_" + _identity, '');
            }

            clsNameStr = clsNameStr.replace(/_/g, '-');

            if ($pageout.length) {
                pageid += '_' + $pageout[0].id;
            }

            var $page = cache[pageid];

			if (!$page) {
				$page = $('<div id="' + pageid + '" class="' + clsNameStr + ' page out" data-onpagefirstinto="none" data-callback="serviceChange"><div class="page-loading wev-loading">' + i18n.LOADING_DATA + '</div></div>');
				$(document.body).append($page);
				cache[pageid] = $page;
			} else {
				isRerender = !_identity;
            }
            
			var pagein = $page[0];
			
			if(cfg.classAnimation && !cfg.preload){
			    var pageOutAnimation = $pageout.attr("data-form");
			    !pageOutAnimation && $pageout.attr("data-form", cfg.classAnimation);
			    $page.attr("data-form", cfg.classAnimation);
			    pagein.flagAniBind = false;
			    pagein.animationend = function(page, cls) {
	                if(cls == 'out' && page.classList.contains("reverse")){
                        !pageOutAnimation && $pageout.removeAttr("data-form").removeClass(cfg.classAnimation);
                        $page.removeAttr("data-form").removeClass(cfg.classAnimation);
	                }
	            };
			}
			!cfg.preload && Mobilebone.transition(pagein, $pageout[0], false, {});

			if (!isRerender) {
				return;
			}

			var service = new Service(id);

			service.load().then(function (tpl, serv) {
				tpl = mUtil.replaceI18n(tpl);
				$page.html(tpl);
				serv.mounted($page, cfg);
			});
		},
		preload: function (id) { // 预加载service页面资源
			new Service(id).preload();
		},
		load: function (id, callback) {
			var service = new Service(id);

			service.load(callback);
		},
		getService: function (id) {
			return new Service(id);
		}
	};
});