// 系统内置属性组件 var resourceHtml = '
'; //CSS·组件 Vue.component("css", { props: ["src"], template: resourceHtml, created: function () { var self = this; //内联样式 if (this.$slots.default) { var css = "'; //防止重复加载资源 if ($("head").html().indexOf(css) == -1) { $("head").append(css); } //延迟 setTimeout(function () { self.$parent.data.lazyLoadCss = true; }, 10); } //外联样式 if (this.src) { //防止重复加载资源 if ($("head").html().indexOf(this.src) == -1) { var styleNode = createLink(this.src); styleOnload(styleNode, function () { self.$parent.data.lazyLoadCss = true; }); } else { //延迟 setTimeout(function () { self.$parent.data.lazyLoadCss = true; }, 10); } } } }); //JavaScript脚本·组件 Vue.component("js", { props: ["src"], template: resourceHtml, created: function () { var self = this; //如果JS全部是内部代码,则延迟10毫秒 //如果JS有内部代码、也有外部JS,则以外部JS加载完成时间为准,同时延迟10毫秒,让外部JS中的组件进行加载 //如果JS全部是外部代码,则以外部JS加载完成时间为准,同时延迟10毫秒,让外部JS中的组件进行加载 //内联js if (this.$slots.default) { var script = ""; $("body").append(script); //如果有外部JS,则以外部JS加载完成时间为准 if (this.$parent.data.outerCountJs == 0) { setTimeout(function () { self.$parent.data.lazyLoad = true; }, 10); } } //外联js if (this.src) { $.getScript(this.src, function (res) { setTimeout(function () { self.$parent.data.lazyLoad = true; }, 10); }); } } }); //[颜色]属性组件 var colorHtml = '
'; colorHtml += '
'; colorHtml += ''; colorHtml += '
{{parent[d.field]}}
'; colorHtml += '
'; colorHtml += '
'; colorHtml += '重置'; colorHtml += '
'; // colorHtml += '
'; colorHtml += '
'; colorHtml += '
'; /** * 颜色组件: * 参数说明: * data:{ field : 字段名, value : 值(默认:#333333), 'label' : 文本标签(默认:文字颜色) } */ Vue.component("color", { props: { data: { type: Object, default: function () { return { field: "textColor", label: "文字颜色", defaultcolor: "" }; } }, }, data: function () { return { d: this.data, class_name: "", parent: (Object.keys(this.$parent.data).length) ? this.$parent.data : this.$parent.global, }; }, created: function () { this.bindColor(); }, watch:{ }, methods: { init:function(){ if (this.data.field == undefined) this.data.field = "textColor"; if (this.data.label == undefined) this.data.label = "文字颜色"; if (this.data.value == undefined) this.data.value = "#333333"; if (this.data.defaultcolor == undefined) this.data.defaultcolor = ""; if (this.data.defaultvalue == undefined) this.data.defaultvalue = ""; if(this.data.global == 1) this.parent = this.$parent.global; if (this.parent[this.data.field] == undefined) this.$set(this.parent, this.data.field, this.data.value); else this.data.value = this.parent[this.data.field]; this.parent[this.data.field] = this.data.value; this.d = this.data; }, reset: function () { try { if(this.data.global == 1) this.parent = this.$parent.global; this.parent[this.d.field] = this.d.defaultcolor; } catch (e) { console.log("color reset() ERROR:" + e.message); } }, bindColor() { this.init(); this.class_name = "colorSelector_" + (this.data.field ? this.data.field : "textColor") + get_math_rant(10); var class_name = "." + this.class_name; var $self = this; setColorPicker($self.data.value, this.class_name, function (hex) { try { if(hex) { $self.parent[$self.d.field] = hex; } else { $self.parent[$self.d.field] = ""; } } catch (e) { console.log("color ERROR:" + e.message); } }); }, refreshData(){ // 刷新parent、data // console.log("this.parent",this.parent); if(this.parent.controller && this.parent.controller != vue.data[vue.currentIndex].controller){ // 数据发送变动 this.parent = vue.data[vue.currentIndex]; this.init(); // console.log("数据发送变动",this.d); } return this.parent; } }, template: colorHtml }); /** * 生成颜色选择器 * @param defaultColor * @param obj * @param callBack */ function setColorPicker(defaultColor, name, callBack) { setTimeout(function () { var obj = document.getElementById("picker"); var a = Colorpicker.create({ el: name, color: defaultColor, change: function (elem, hex) { $(elem).find("div").css('background', hex); if (callBack) callBack(hex); } }); if(defaultColor) $("#" + name).find("div").css('background', defaultColor); }, 500); } //[图片上传]组件 var imageSecHtml = '
'; imageSecHtml += '
'; imageSecHtml += ''; imageSecHtml += ''; imageSecHtml += '
'; imageSecHtml += '
'; /** * 图片上传 * 参数说明: * data:{ field : 字段名, value : 值(默认:14), 'label' : 文本标签(默认:文字大小) } */ Vue.component("img-sec-upload", { template: imageSecHtml, props: { data: { type: Object, default: function () { return { data: {}, field: "imageUrl", callback: null, text: "添加图片" }; } }, condition: { type: Boolean, default: true }, currIndex: { type: Number, default: 0 }, isShow:{ type: Boolean, default: true } }, data: function () { return { myData: this.data, upload : null, id : get_math_rant(10), // parent: (Object.keys(this.$parent.data).length) ? this.$parent.data : this.data, }; }, watch: { data: function (val, oldVal) { if (val.field == undefined) val.field = oldVal.field; if (val.text == undefined) val.text = "添加图片"; this.myData = val; } }, created: function () { if (this.data.field == undefined) this.data.field = "imageUrl"; if (this.data.data[this.data.field] == undefined) this.$set(this.data.data, this.data.field, ""); if (this.data.text == undefined) this.data.text = "添加图片"; this.id = get_math_rant(10); }, methods: { del: function () { // console.log(this.$parent.list) // this.$parent.list.splice(this.currIndex,1) this.data.data[this.data.field] = ""; }, //转换图片路径 changeImgUrl: function (url) { if (url == null || url == "") return ''; else return url; }, showImageDialog: function(elm, options) { var self = this; var ipt = $(elm).prev(); var val = ipt.val(); require(["util"], function (util) { options = { 'class_extra': 'order_menu_icon', 'global': false, 'direct': true, 'multiple': false, 'fileSizeLimit': 10240 }; util.image(val, function (url) { if (url.url) { self.data.data[self.data.field] = url.url; } }, options); }) } } }); //滑块属性组件 用于间距等 var sliderHtml = '
'; sliderHtml += ''; sliderHtml += '
'; sliderHtml += '
'; sliderHtml += '{{parent[data.field]}}'; sliderHtml += '
'; sliderHtml += '
'; Vue.component("slide", { props: { data: { type: Object, default: function () { return { field: "height", label: "空白高度", max: 100, min: 0 }; } } }, created: function () { if (this.data.label == undefined) this.data.label = "空白高度"; if (this.data.field == undefined) this.data.field = "height"; if (this.data.max == undefined) this.data.max = 100; if (this.data.min == undefined) this.data.min = 0; var _self = this; setTimeout(function () { layui.use('slider', function(){ var slider = layui.slider; var ins = slider.render({ elem: '#'+_self.id, max: _self.data.max, min: _self.data.min, tips: false, theme: '#FF6A00', value : _self.parent[_self.data.field], change: function(value){ _self.parent[_self.data.field] = value; } }); }); },10); }, watch: { data: function (val, oldVal) { if (val.field == undefined) val.field = oldVal.field; if (val.label == undefined) val.label = "空白高度"; if (val.max == undefined) val.max = 100; if (val.min == undefined) val.min = 0; }, }, template: sliderHtml, data: function () { return { id : "slide_" + get_math_rant(10), parent: this.$parent.data, }; } }); //链接属性组件 var linkHtml = ''; /** * 链接组件: * 参数说明:data:当前链接对象, click:绑定事件,触发回调 */ Vue.component("sel-link", { //data:链接对象,callback:回调,refresh:刷新filed props: { data: { type: Object, default: function () { return { //链接对象 field: null, //文本 label: "链接地址", //批量操作对象 operation: [ {key: "system", method: '', label: "请选择链接"} ], supportDiyView: "", supportToApplet: 1 }; } }, callback: null, refresh: null, }, template: linkHtml, data: function () { return { myData: [this.data],//此处用数组的目的是触发变异方法,进行视图更新 }; }, created: function () { if (this.data.supportToApplet == undefined) this.data.supportToApplet = 1; if (this.data.supportDiyView == undefined) this.data.supportDiyView = ""; if (this.data.label == undefined) this.data.label = "链接地址"; if (this.data.operation == undefined) this.data.operation = [{ key : "system", method : '' , label: "请选择链接" }]; }, watch: { data: function (val, oldVal) { if (this.data.supportDiyView == undefined) this.data.supportDiyView = ""; if (this.data.label == undefined) this.data.label = "链接地址"; if (this.data.operation == undefined) this.data.operation = [{ key : "system", method : '' , label: "请选择链接" }]; this.myData[0].field= this.data.field; }, refresh:function (val,oldVal) { this.myData[0].field = val; this.set(val); } }, methods: { //设置链接地址 set: function (link) { //由于Vue2.0是单向绑定的:子组件无法修改父组件,但是可以修改单个属性,循环遍历属性赋值 if (this.data.field) { for (var k in link) { this.data.field[k] = link[k]; } } //触发变异方法,进行视图更新 this.myData.push({}); this.myData.pop(); }, selected: function (key,method) { var $self = this; if(key == "system") { //系统链接 select_link($self.myData[0].field,$self.myData[0].supportDiyView, function (data) { $self.set(data); if ($self.callback) $self.callback.call(this, data); }, $self.data.supportToApplet); }else { //插件自定义链接 ns[method]($self.myData[0].field, $self.myData[0].supportDiyView, function (data) { $self.set(data); if ($self.callback) $self.callback.call(this, data); }, $self.data.supportToApplet); } } } }); //[视频上传]组件 var videoSecHtml = '
'; videoSecHtml += '
'; videoSecHtml += ''; videoSecHtml += ''; videoSecHtml += '
'; videoSecHtml += '
'; /** * 视频上传 * 参数说明: * data:{ field : 字段名, value : 值(默认:14), 'label' : 文本标签(默认:文字大小) } */ Vue.component("video-upload", { template: videoSecHtml, props: { data: { type: Object, default: function () { return { data: {}, field: "videoUrl", callback: null, text: "添加视频" }; } }, condition: { type: Boolean, default: true }, currIndex: { type: Number, default: 0 }, isShow:{ type: Boolean, default: true } }, data: function () { return { myData: this.data, upload : null, id : get_math_rant(10), }; }, watch: { data: function (val, oldVal) { if (val.field == undefined) val.field = oldVal.field; if (val.text == undefined) val.text = "添加视频"; this.myData = val; } }, created: function () { if (this.data.field == undefined) this.data.field = "videoUrl"; if (this.data.data[this.data.field] == undefined) this.$set(this.data.data, this.data.field, ""); if (this.data.text == undefined) this.data.text = "添加视频"; this.id = get_math_rant(10); }, methods: { del: function () { this.data.data[this.data.field] = ""; }, //转换图片路径 changeVideoUrl: function (url) { if (url == null || url == "") return ''; else return url; }, showVideoDialog: function(elm, options) { var self = this; var ipt = $(elm).prev(); var val = ipt.val(); require(["util"], function (util) { options = { type: 'video' }; util.audio(val, function (url) { if (url.url) { self.data.data[self.data.field] = url.url; } }, options); }) } } });