avalon.oniui icon indicating copy to clipboard operation
avalon.oniui copied to clipboard

通过vm修改OniUI的dropdown组件时报 avalon.dropdown 设置label出错,或Cann't read property'$events' of null

Open spuerFan opened this issue 10 years ago • 8 comments

最简单的复现方式,debug在控制台修改 currenttime的值后,就会报错; (应用需求是:两级联动,切换国家时会动态查询其城市,并选中人口最多的那个城市) avalon.js 1.46 built in 2015.8.24

spuerFan avatar Sep 17 '15 13:09 spuerFan

ms-duplex="currenttime"

spuerFan avatar Sep 17 '15 13:09 spuerFan

这个问题没复现,你怎么去设置的currenttime值?

yuhaoju avatar Sep 18 '15 02:09 yuhaoju

@roscoe054 我也遇到同样的问题了,我初步查了下,是因为用到了双向绑定后,手动直接给dropdown value属性设置值, setLabelTitle入参是一个数组,item.value === value 永远不可能为true的。

        //设置label以及title
        function setLabelTitle(value) {
            var option = vmodel.data.$model.filter(function(item) {
                return item.value === value;
            });

            option = option.length > 0 ? option[0] : null

            if(!option && vmodel.data.length) {
                avalon.log("[log] avalon.dropdown 设置label出错");
            } else if (option) {
                vmodel.label = option.label;
                vmodel.title = option.title || option.label || "";
            }

            return option;
        }

官网这个demo http://ued.qunar.com/oniui/dropdown/avalon.dropdown.ex5.html 也可以重现 在console里 执行 avalon.vmodels.dropdown788058329374.val('Value 3') 或 avalon.vmodels.dropdown788058329374.value = 'Value 3' 就会报错

codering avatar Sep 22 '15 01:09 codering

已修复val()方法 另外.value方式只能设置初始值,该值的话还是用val()方法 比较推荐的还是通过该组件的父vmodel,改变它所绑定的ms-duplex变量去改变组件的value

yuhaoju avatar Sep 22 '15 03:09 yuhaoju

@roscoe054 我是在使用dropdownlist组件的时候发现的,你看看里面的实现,就有直接改变 dropdown.value的值,是不是应该改改?

codering avatar Sep 22 '15 07:09 codering

@roscoe054 又看了下dropdown的源码,感觉有些地方需要改进下,您看下对不对:

         /**
             * @interface
             * @param newValue 设置控件的值,需要注意的是dropdown设置了multiple属性之后,值是数组,未设置multiple属性的时候,可以接受字符串,数字,布尔值;未设置该值时,效果是返回当前控件的值
             * @returns vmodel.value 控件当前的值
             */
            vm.val = function(newValue) {
                if (typeof newValue !== "undefined") {
                    if (avalon.type(newValue) !== "array") {   // 疑问1, 这里是否该增加判断vmodel.multiple?
                        newValue = [newValue];
                    }
                    vmodel.value = newValue;
                }
                return vmodel.value;
            }
 //设置label以及title
        function setLabelTitle(value) {
            // 没必要在filter里判断
            /* 
               if(!vmodel.multiple && avalon.type(value)==="array") {
                     value = value[0];
               }
              var option = vmodel.data.$model.filter(function(item) {
                    return item.value === value;
                }
               });
            */
            var option = vmodel.data.$model.filter(function(item) {
                if(typeof value === "object"){     // 疑问2, 这里没必要每次都判断吧?
                    return item.value === value[0];
                } else{
                    return item.value === value;
                }
            });

            option = option.length > 0 ? option[0] : null

            if(!option && vmodel.data.length) {
                avalon.log("[log] avalon.dropdown 设置label出错");
            } else if (option) {
                vmodel.label = option.label;
                vmodel.title = option.title || option.label || "";
            }

            return option;
        }

codering avatar Sep 22 '15 07:09 codering

@codering dropdownlist也只是在初始化时的吧,.value其实还是没有暴露出来给用户用来修改的 filter那段是不合理,已修改。上面multiple那段都传数组应该是没问题的

yuhaoju avatar Sep 22 '15 10:09 yuhaoju

@roscoe054 再帮我看个dropdown的问题,demo在这里https://github.com/codering/avalon_demo/tree/test 麻烦您clone下来按重现步骤运行下. 谢谢!

codering avatar Sep 22 '15 13:09 codering