我有一个web应用程序,其中接口基于vue.js 2.0。如何从vue.js中的另一个组件更新一个组件
我有基于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;
});
}
}
}
的问题是:我想要显示多个不同的selects
使用该组件。名称属性可以是以下之一:model1[field1]
,model1[field2]
,...,model40[field1]
,...,model99[field15]
,其中每个模型N对应于数据库中具有其各自字段的表。
当用户改变选项,AJAX请求必须被发送到服务器,它返回JSON对象像这样
{
"errorText": null or "text with error",
"disableFields": ["model3[field4]", "model24[field15]"]
}
我想分析“disableFields”阵列和从this
组分another
组件禁用。做到这一点(伪代码)
方式一:
foreach field in disableField:
$(document).trigger("disableField" + field);
而且在this
组件
var self = this;
$(document).on("disableField" + this.name, function() {
self.isEnabled = false
})
是否有更好的方法来做到这一点没有父组件的mounted
方法?
对未来,尽量做到短。你的问题质量好,但太长了... –