Bootstrap selectpicker VueJS指令

时间:2015-09-29 12:19:00

标签: jquery twitter-bootstrap directive vue.js

我正在尝试为Bootstrap构建一个自定义指令,该指令将<select>输入到&#34; selectpicker&#34;来自Bootstrap selectpicker 另外,我希望此指令使用VueJS的默认options功能来填充<select>上的选项 所以html会是这样的:

<select v-selectpicker="myValue" options="myOptions"></select>

现在我可以完美地创建指令并使用bind方法在元素上调用selectpicker()方法。问题似乎是在调用selectpicker()之后设置了选项。 所以我需要等到设置选项,或者在设置选项时我必须再次调用selectpicker(refresh)

有人知道这是否可行?

5 个答案:

答案 0 :(得分:3)

只有当您从服务器提供选项时,提供的答案才有效。尝试初始化Bootstrap-select使用Vue数据作为选项总是在呈现选项之前调用它。

我的解决方案是使用一个组件并将选项/选择名称和回调函数作为道具传递,我可以确定它们都已加载。

HTML

<select-picker :name.sync="itemsPerPage" :options.sync="itemsPerPageOptions" :function="changeItemsPerPage"></select-picker>    

JS - Selectpicker Component

Vue.component('select-picker', {
template:'<select v-model="name" class="themed-select" @change="function">' +
'<option v-bind:value="option.value" v-for="option in options">{{ option.label }}</option>' +
'</select>',
name: 'selectpicker',
props: ['options', 'name', 'function'],
updated: function() {
    console.log(this);
    $(this.$el).selectpicker({
        iconBase: 'fa',
        tickIcon: 'fa-check'
    });
}
});

答案 1 :(得分:1)

我改变了mocheaz的一点解决方案。如果动态放置select标记,它已经设置了初始值:

require('bootstrap-select');

Vue.directive('selectpicker',
{
    twoWay: true,

    bind()
    {
        $(this.el).selectpicker();

        $(this.el).on('change', function(e) {
            this.set($(this.el).val());
        }.bind(this));
    },

    update(newValue)
    {
        $(this.el).val(newValue);
        $(this.el).selectpicker('val', newValue);
    },

    unbind()
    {
        $(this.el).selectpicker('destroy');
    }
});

答案 2 :(得分:0)

我这样做了,它对我有用。

Vue.directive('selectpicker', {
    twoWay: true,
    bind: function() {
        $(this.el).on("change", function(e) {
            this.set($(this.el).val());
        }.bind(this));
    },
    update: function(nv, ov) {
        $(this.el).trigger("change");
    }
});

答案 3 :(得分:0)

这对于那些正在寻找能够使用bootstrap-select和vue.js(v2.5)的人来说非常有用

指令:

Vue.directive('selectpicker',
{
    inserted(el) {
        $(el).selectpicker(
            {/*options*/},
        });
    },

    update(el, binding) {        
        $(el).selectpicker('val', binding.value);
    },

    componentUpdated(el) {
        $(el).selectpicker('refresh');
    },

    unbindel() {
        $(el).selectpicker('destroy');
    }
});

HTML:

<select 
    class="selectpicker form-control" 
    v-selectpicker="mySelectedModel" 
    v-model="mySelectedModel">
    <!-- options -->
</select>

答案 4 :(得分:0)

Vue.directive('selectpicker',{
inserted:function(el) {     
    jQuery(el).selectpicker({
        title: 'Choose...',
        liveSearch:true,
        dataHeader:"Type in to filter",
        style: 'btn btn-default btn-round',
        size: 10
    }).selectpicker('render');

},
componentUpdated:function(el, binding) {
    jQuery(el).selectpicker('val', binding.value);
    jQuery(el).selectpicker('refresh');
}

});

用法:

<select class="form-control" v-model="causeOfLoss" v-selectpicker="causeOfLoss"> ... </select>