FSelect_wev8.js 6.65 KB
define(['mUtil', "Component", "Form"], function (mUtil, Component, Form) {
	var FSelect = function (options) {
		var $container, $wevField, $field, _sel = {}, mecid;

		Component.super(this, options);

		this.type = "FSelect";
		this.tpl = this.type + "_html";
        this.dataload = true;

		var vm = this.viewModel = {
			form: "",
			field: {
				label: "", //显示名
				name: "", //字段名
				id: "", //字段id
				value: "", //字段默认值
				defaultValue: ""
			},
			items: [],
			detailtable: {
				isA: false //是否是明细表字段
			},
			required: false,
			readonly: false,
			needWrap: false,
			attrLinkage : {
				triggers: null,
				isEditLayout : false
			}
		};

		this.dbValueHasSet = false; //是否已设置表单数据值,调用this.setValueByDB()方法后修改此状态
		
		this.beforeMount = function () {
			//主表或明细新增,并且值为空 但默认值不为空时,使用默认值代替赋值
            Form.utils.setDefaultValue(this.pageid, vm);
		};

		var d = $.Deferred();
		this.mounted = function () {
		    var that = this;
			$wevField = this.$el.find(".wev-field");
			$field = this.$el.find("select");
			$container = this.$container;
			mecid = this.id;
			vm.readonly && $field.addClass("read-only");
			if (vm.items === true) {
				var actionUrl = mUtil.getActionUrl(this.type, {
					action: "getOptionDatas",
					mec_id: this.id,
					detailtable: vm.detailtable.id
				}, this.pageid);
				mUtil.getJSON(actionUrl, function (result) {
					var datas = result.datas;
					var optionHtml = "";
					$(datas).each(function (index, val) {
						var selected = (val.value == vm.field.value) ? "selected='selected'" : "";
						optionHtml += "<option value='" + val.value + "' " + selected + ">" + val.name + "</option>";
					});
					$field.html(optionHtml);
				}).then(function () {
					d.resolve();
				});
			} else {
				d.resolve();
			}
			if(vm.field.needParseSqlValue){
			    //解析默认值,默认值sql
	            return Form.utils.parseDefaultSqlValue(vm.field.defaultValue, this.pageid, function(result){
	                vm.field.value = result;
	                //设置默认值
	                that.setValue(vm.field.value, true);
	            });
			}
			vm.attrLinkage.triggers && this.bindAttrLinkage(vm.attrLinkage.triggers,vm.attrLinkage.isEditLayout);
		};

		this.initComponentData = function () {
			return d;
		};

		this.getData = function () {
			return mUtil.parseJSON("fieldname_" + vm.field.name, $field.val());
		};

		this.getShowData = function () {
			var fieldvalue = $field.val(),
				showData = mUtil.parseJSON(vm.field.name, fieldvalue);
			showData[vm.field.name + "_showvalue"] = $("option[value='" + fieldvalue + "']", $field).text() || "";
			return showData;
		};

		this.reset = function () {
			this.setValue(vm.field.value);
			$wevField.removeClass("wev-required-remind");
		};

		this.checkRequired = function () {
			var required = vm.required && !$field.val();
			var fieldLabel = vm.field.label || mUtil.getLabel(24120, "选择项");

			$wevField.toggleClass("wev-required-remind", required);
			
			return required && fieldLabel;
		};

		this.bindTrigger = function (triggers, isTrigger) {
			var that = this,
				fieldid = vm.field.id,
				pFieldid = vm.field.parentid;
			//字段联动
			if (fieldid && mUtil.isObject(triggers) && triggers["field" + fieldid]) {
				var trigger = triggers["field" + fieldid];

				$field.on("change", function () {
					Mobile_NS.readyToTrigger(trigger, $field, that.$container);
				});
				//默认值触发字段联动,主表新建或者是明细表添加数据时触发
				if (vm.field.value && ((vm.form.indexOf("detailtable") == -1 && !$p("billid")) || isTrigger)) {
					Mobile_NS.readyToTrigger(trigger, $field, that.$container);
				}
			}
			//绑定选择框联动
			if (fieldid && vm.field.childid) {
				$field.on("change", function () {
					_sel.initSelect(vm.field.id, vm.field.childid, $field.val(), "", function () {
						$(this).change();
					});
				});
			}
			//选择框联动初始化
			if (pFieldid && fieldid) {
				var $pField = $container.find("[fieldid='" + pFieldid + "']"),
					selectVal = $pField.val() || "",
					defVal = vm.field.value;
				_sel.initSelect(pFieldid, fieldid, selectVal, defVal);
			}
		};

		this.setValueByDB = function (value) {
			this.dbValueHasSet = true;
			if (value || !vm.field.value) {
				vm.field.value = value;
				this.setValue(value);
			}
		};

		this.setValue = function (v) {
			$field.val(v).triggerHandler("change");
			this.dbValueHasSet && mUtil.trigger('dataload', this.pageid, this.id);
		};

		this.getValue = function () {
			return $field.val();
		};

		this.setRequired = function (required) {
			vm.required = required;
			$wevField.toggleClass("wev-field-required", required);
			!required && $wevField.removeClass("wev-required-remind");
		};

		//属性联动
		this.bindAttrLinkage = function (linkages, isEditLayout) {
			vm.attrLinkage.triggers = linkages;
			vm.attrLinkage.isEditLayout = isEditLayout;
			linkages && $field.on("change", function () {
				require(['attrLinkageHelper'],function(attrLinkageHelper) {
					attrLinkageHelper.trigger(linkages,mecid);
				});
			});

			// if (!isEditLayout) { //  编辑布局首次不触发
			// 	vm.detailtable.isA && setTimeout(function () {
			// 		$field.triggerHandler("change")
			// 	}, 500) || $field.triggerHandler("change");
			// }
			if ($field.val()) {
				vm.detailtable.isA && setTimeout(function () {
					$field.triggerHandler("change")
				}, 500) || $field.triggerHandler("change");
			}
		};

		this.text = function () {
			var index = $field[0].selectedIndex;
			return $field.find("option").eq(index).text();
		};

		_sel.initSelect = function (pFieldid, fieldid, pFieldVal, defVal, callback) {
			if (!pFieldid || !fieldid) return;

			var $childField = $container.find("[fieldid='" + fieldid + "']");

			if (!$childField.length) return;

			var actionUrl = mUtil.getActionUrl("service.MobileCommon", {
				action: "selectChange"
			});
			var _init = function (html) {
				$childField.empty().html(html);
				mUtil.isFunction(callback) && callback.call($childField[0]);
			};

			if (!pFieldVal) {
				return _init("");
			}

			mUtil.getJSON(actionUrl, {
				fieldid: pFieldid,
				childfieldid: fieldid,
				selectvalue: pFieldVal
			}, function (result) {
				var datas = result.datas,
					optionHtml = "<option></option>";

				if (datas && datas.length) {
					$(datas).each(function (index, val) {
						var selected = defVal == val.value ? "selected='selected'" : "";

						optionHtml += "<option value='" + val.value + "' " + selected + ">" + val.text + "</option>";
					});
				}

				_init(optionHtml);
			});
		};
	};
	return Component.init(FSelect);
});