我有web应用程序,其中界面基于vue.js 2.0.
我有基于select2插件显示输入的组件.
默认情况下,它会显示所选的选项,但是当用户单击它时,我会显示select2以允许用户修改选项.
代码如下所示:
<template>
<div @click="toggleEdit">
<span v-show="isEnabled">
<select
class="form-control"
:name="name"
:multiple="multiple"
>
<option v-for="opt in options" :value="opt.id"> {{ opt.text }} </option>
</select>
</span>
<span v-show="!isEnabled">
<div v-if="selectedOptions.length === 0">
{{ emptyText }}
</div>
<div v-for="opt in selectedOptions">
{{ opt }}
</div>
</span>
</div>
</template>
<script>
export default {
props: {
options: {
type: Array,
required: false,
default: function() {
return []
}
},
name: {
required: true,
type: String
},
multiple: {
required: false,
type: Boolean,
default: false
},
emptyText: {
required: false,
type: String,
default: ""
},
sourceUrl: {
required: false,
type: String,
default: ""
},
enabled: {
required: false,
type: Boolean,
default: false
}
},
data() {
return {
isEnabled: this.enabled
}
},
watch: {
options: {
handler: function() {
console.log(arguments)
},
deep: true
}
},
mounted: function() {
this.select = $(this.$el).find("select");
this.select.select2();
var that = this;
this.select.on("change", function(e) {
var indexMap = {};
for(var i = 0; i < that.options.length; i++) {
that.options[i].selected = false;
indexMap[that.options[i].id] = i;
}
var selected = that.select.select2('val');
if(typeof selected === "string") {
selected = [selected];
}
for(var i = 0; i < selected.length; i++) {
var index = indexMap[selected[i]];
console.log(index)
console.log(selected[i])
if(index !== undefined) {
var option = that.options[index];
option.selected = true;
that.$set(that.options, index, option);
}
}
})
this.select.on("select2:open", function() {
that.isEnabled = true;
});
this.select.on("select2:close", function() {
that.isEnabled = false;
});
},
methods: {
toggleEdit() {
if(this.isEnabled) return; // to pass select2 clicks
this.isEnabled = !this.isEnabled;
var that = this;
this.$nextTick(function() {
that.select.select2("open");
});
}
},
computed: {
selectedOptions: function() {
console.log(this.options)
return this.options.filter(function(option) {
console.log(option.selected);
if(option.selected === true) return true;
return false;
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:我想selects
使用这个组件显示多个不同的.Name属性可以是以下之一:model1[field1]
,, model1[field2]
...,model40[field1]
... model99[field15]
,其中每个modelN对应于数据库中具有相应字段的表.
当用户更改选项时,必须将ajax请求发送到服务器,服务器返回这样的json-object
{
"errorText": null or "text with error",
"disableFields": ["model3[field4]", "model24[field15]"]
}
Run Code Online (Sandbox Code Playgroud)
我想解析"disableFields"数组并禁用this
组件 another
组件.
实现此目的的一种方法(伪代码):
foreach field in disableField:
$(document).trigger("disableField" + field);
Run Code Online (Sandbox Code Playgroud)
并且在组件的mounted
方法中this
var self = this;
$(document).on("disableField" + this.name, function() {
self.isEnabled = false
})
Run Code Online (Sandbox Code Playgroud)
没有父组件有更好的方法吗?
小智 19
你可以使用this.$root
没有全局变量:
// component A emits an event
export default {
name: 'A',
methods: {
buttonClicked: function () {
this.$root.$emit('myEvent', 'new message!');
}
}
// component B catch your event
export default {
name: 'B',
data () {
return {
message: 'Old message!'
}
},
mounted: function () {
this.$root.$on('myEvent', (text) => { // here you need to use the arrow function
this.message = text;
})
}
}
Run Code Online (Sandbox Code Playgroud)
kek*_*coh 16
不允许直接与其他组件通信.您可以使用父组件在组件或某种事件总线之间进行通信.
var bus = Vue()
Run Code Online (Sandbox Code Playgroud)
组件A发出事件,而组件B可以捕获它,反之亦然.
// component A
bus.$emit('cool_event_name', interesting_data)
// component B
bus.$on('cool_event_name', function(interesting_data) {
console.log(interesting_data)
})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12986 次 |
最近记录: |