使用KnockoutJS捕获自定义的jQueryUI小部件内的数据改变

使用KnockoutJS自定义绑定捕获自定义的jQueryUI小部件内的数据改变

定义要绑定的数据

function ViewModel(){
	var self = this;
	self.club =  ko.observable("");
}

HTML代码

绑定创建的自定义绑定superDialog

<input type="text" id="club" autocomplete="off" data-bind="superDialog:{ value: club }"/>

创建自定义绑定并调用

$(document).ready(function(){
	ko.bindingHandlers.superDialog = {
        init: function(element, valueAccessor, allBindings) {
            var $el = $(element);//界面绑定的元素(input)
            var binds = valueAccessor();//界面绑定的superDialog{}里面的参数
            //自定义jQueryUI组件superDialog
            $el.superDialog({
                clubsinfo:JSON.parse(localData.get("clubs")),
                changed: function(data){//在change事件里面更改界面绑定的club值
                    binds.value(element.value);
                }
            });
        },
        update: function(element, valueAccessor, allBindings){
            var binds = valueAccessor();
            var $el = $(element);
            element.value = binds.value();
        }
    };
    var vm = new ViewModel();
    ko.applyBindings(vm);
});

jQueryUI小部件

(function ($) {
    $.widget( "custom.superDialog", {
        options:{
            clubsinfo:[],
            clubslist:"",
            arr0:[],
            selectedValue: [],
            changed: function(data){//主要是创建一个change事件

            }
        },
        _create:function(){
            this._initelement();
            this._initevent();
        },
        _initelement:function(){
            var self  = this,
                options = self.options,
                element = self.element;
            var fillhtml = '<ul class="hidden datalist" id="datalist" style="position: absolute"></ul>';
            element.after(fillhtml);
            self._cluboption();
            
        },
        _initevent:function(){
            var self  = this,
                element = self.element;
            element.on("focus",element,self._show);
            $(".li-item").on("click",self,self._chooseitem);
            $(document).bind("click",self,self._binddo);
        },
        _cluboption:function(){
            var self = this,
                options = self.options;
                var id  = 0;
            for (let i = 0; i < options.clubsinfo.length; i++) {

                const element = options.clubsinfo[i];
                options.clubslist += '<li class="li-item">'+element.subject+'</li>'
                id= id+1;
                var nem ={
                    id: id.toString(),
                    value: element.subject
                }
                options.selectedValue.push(nem)
            }
            $("#datalist").append(options.clubslist);
        },
        _show:function(){
            $(".datalist").removeClass("hidden");
        },
        _chooseitem:function(event){
            var self = event.data,
            options = self.options;
            var item0 = this.innerText;
            let arr3 = options.arr0.map(v=>v.value)
            $.each(options.selectedValue,function(i,v){
                if (v.value.indexOf(item0)!==-1 && arr3.indexOf(item0)==-1) {
                    options.arr0.push(v)
                }
            })
            arr3 = options.arr0.map(v=>v.value);
            var subList = arr3.join(',');
            $(self.element).val(subList);
            options.changed.call(self, options.arr0);//arr0更改时调用change事件
        },
        _binddo:function(e){
            var e = e || window.event; //浏览器兼容性
            var elem = e.target || e.srcElement;
            //判断点击的是输入框
            if (elem.id && elem.id=='club') {
                return;
            }
            $(".datalist").addClass("hidden") //点击的不是div或其子元素
        },
        refresh:function(){
            var self = this,
            options = self.options;
            options.arr0 = [];
            
        }

        
    });
})(jQuery);

call()

call与apply的第一个参数都是要传入给当前对象的对象,及函数内部的this,后面的参数都是传递给当前对象的参数。
语法:obj1.call(obj2[,param1,param2,…]);
定义:用obj2对象来代替obj1,调用obj1的方法。即将obj1应用到obj2上;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值