Tab_wev8.js 5.53 KB
define(['mUtil', "Component"],function(mUtil, Component) {
	var Tab = function(options) {
		var _tab = {};
		
		Component.super(this, options);
		
		this.type = "Tab";
		this.tpl = this.type + "_html";
		this.css = [this.type + "_css", "commonTab_css"];
		
		var vm = this.viewModel = {
			tabs : [],
			badge: null,
			lazyload: true,
			standalone : true
		};
		
		this.beforeMount = function(){
		    vm.remindApis = [];
		    vm.tabs.map(function(tab){
		        if(tab.remind && tab.remindapi && tab.remindapi.api){
		            tab.uuid = tab.remindapi.uuid = mUtil.UUID();
		            tab.apiid = tab.remindapi.api.id;
		            vm.remindApis.push(tab.remindapi);
		            delete tab.remindapi;
		        }
		    });
		    
            if(vm.badge === true){
                vm.badge = mUtil.getActionUrl(this.type, {action:"getBadge", "mec_id": this.id}, this.pageid);
            }
        };
		
		this.mounted = function(){
		    var that = this, $comp = this.$el.children(".wev-comp-" + this.type), $tabNavs = $(".wev-tab-nav", $comp), deferreds = [];
		    if(vm.lazyload){
		        deferreds.push(_tab.loadTabPanel(0));
		    }else{
		        $tabNavs.each(function(){
		            var tabIndex = $(this).index();
		            deferreds.push(_tab.loadTabPanel(tabIndex, tabIndex > 0 ? true : false));
	            });
		    }

            $tabNavs.on("click", function(){
				var $nav = $(this);
				var index = $nav.index();
				
				if ($nav.hasClass("wev-tab-selected")) return;

				$nav.addClass("wev-tab-selected").siblings("li.wev-tab-selected").removeClass("wev-tab-selected");
				var $tabpanel = $(".wev-tab-panel", $comp).addClass("wev-tabpanel-hidden").eq(index).removeClass("wev-tabpanel-hidden");
				_tab.toggleExternalCompnents(index);
				_tab.loadTabPanel(index, function(compoids){
				    compoids.forEach(function(compoid) {
                        var ins = mUtil.getInstance(compoid, that.pageid);
                        ins.onResetView && ins.onResetView();
                    });
					//触发图片延迟加载
					require(['lazyImgHelper']);
				});
			});
			_tab.loadBadge();
			return $.when.apply($.when, deferreds);
		};
		
		this.refreshBadge = function () {
		    _tab.loadBadge();
        };
		
		this.onTabChange = function (compId, cb) {
			var that = this, $comp = this.$el.children(".wev-comp-" + this.type), $tabNavs = $(".wev-tab-nav", $comp);
			var index = that.$container.find("#" + compId).parent(".wev-tab-panel").index();
			$tabNavs.on("click", function(){
				var $nav = $(this),
					currIndex = $nav.index();
				mUtil.isFunction(cb) && cb(index == currIndex);
			});
		};

        _tab.loadBadge = function () {
            if(vm.badge == null){
                return;
            }
            var $badges = $(".wev-badge", this.$el);
            
            require(["remindHelper"], function (helper) {
                helper.renderBadge(vm.badge, $badges, vm.remindApis);
            });
        };
        
		_tab.toggleExternalCompnents = function (index) {
			var $page = this.$container;
			var $header = $page.children('.page-header');
			var $content = $page.children('.page-content');
			var $footer = $page.children('.page-footer');
			var _toggle = function ($el, position) {
				if (!$el.length) return;

				$el.children('abbr[data-tabpanel]').hide();
				$el.children('abbr[data-tabpanel="' + index + '"]').show();
				$content.css(position, $el.height());
			};

			_toggle($header, "top");
			_toggle($footer, "bottom");
		};

		_tab.loadTabPanel = function(index, forceLazyload, callback){
		    if(mUtil.isFunction(forceLazyload)){
		        callback = forceLazyload;
		        forceLazyload = false;
		    }
			var $comp = this.$el.children(".wev-comp-" + this.type),
				$tabpanel = $(".wev-tab-panel", $comp).eq(index),
				$container = this.$container;
			var pageid = this.pageid;
			var components = [], compoids = [],
			    //强制延迟加载控件
			    forceLazyloadCompos = ["Calendar", "Chart", "BarChart", "FunnelChart", "GaugeChart", "LineChart", 
			                           "PieChart", "RadarChart", "Countdown", "GridTable", "UrlGridTable", "Slide",
			                           "NavPanel", "Toolbar", "NoticeBar"];
			$("abbr[data-type]", $tabpanel).each(function() {
				var $abbr = $(this),
					id = this.id,
					type = $abbr.attr("data-type"),
					loaded = $abbr.data("loaded");
				
				if(loaded){
				    compoids.push(id);
				}else{
				    if(forceLazyload && forceLazyloadCompos.indexOf(type) != -1){
	                    return;
	                }
	                
	                var mecparam = {
	                    el: id,
	                    type: type,
						container: $container,
						pageid: pageid
	                };

	                vm.tabs[index].tabContent.forEach(function (tabItem) {
	                    if (tabItem.el == id) {
	                        $.extend(mecparam, tabItem);
	                    }
	                });

	                mecparam.priority = $abbr.attr("data-priority");
	                components.push(mecparam);
				}
			});
			var deferred = $.Deferred();
			if(!components.length){
			    deferred.resolve();
			}else{
			    Component.load(components, function(){
					deferred.resolve();
	            }, function (component) {
					mUtil.trigger('load', pageid, component.id);
				});
			}
			callback && callback(compoids);
			return deferred;
		};

		_tab.loadTabPanel = _tab.loadTabPanel.bind(this);
		_tab.toggleExternalCompnents = _tab.toggleExternalCompnents.bind(this);
		_tab.loadBadge = _tab.loadBadge.bind(this);
    };

    return Component.init(Tab);
});