通过vm修改OniUI的dropdown组件时报 avalon.dropdown 设置label出错,或Cann't read property'$events' of null
最简单的复现方式,debug在控制台修改 currenttime的值后,就会报错; (应用需求是:两级联动,切换国家时会动态查询其城市,并选中人口最多的那个城市) avalon.js 1.46 built in 2015.8.24
ms-duplex="currenttime"
这个问题没复现,你怎么去设置的currenttime值?
@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' 就会报错
已修复val()方法 另外.value方式只能设置初始值,该值的话还是用val()方法 比较推荐的还是通过该组件的父vmodel,改变它所绑定的ms-duplex变量去改变组件的value
@roscoe054 我是在使用dropdownlist组件的时候发现的,你看看里面的实现,就有直接改变 dropdown.value的值,是不是应该改改?
@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 dropdownlist也只是在初始化时的吧,.value其实还是没有暴露出来给用户用来修改的 filter那段是不合理,已修改。上面multiple那段都传数组应该是没问题的
@roscoe054 再帮我看个dropdown的问题,demo在这里https://github.com/codering/avalon_demo/tree/test 麻烦您clone下来按重现步骤运行下. 谢谢!