我正在使用Angular指令使用Select2构建一个select。
我把这个结构放在link
函数中,如下所示:
var selectProducts = function() {
return {
restrict: 'E',
replace: true,
scope: false,
template: '<select id="products_list" ng-model="product.id" ng-change="setProduct()"></select>',
link: function(scope, element, attrs) {
$(element).select2({
placeholder: 'Select...',
width: '100%',
minimumInputLength: 2,
ajax: {
url: 'url/to/products',
dataType: 'json',
data: function(params) {
return {
q: params.term,
page: params.page
};
},
processResults: function(data, page) {
return {
results: data
};
},
cache: true
}
});
}
};
};
但是我必须在用户触发操作后清理选择。经过一些搜索,要清理Select2,我们必须:
$(element).val(null);
$(element).trigger('change');
当我这样做时,Angular会发疯并触发错误。在堆栈跟踪之后,我们到达:https://docs.angularjs.org/error/ $ rootScope / inprog?p0 = $ apply
我已经完成了他们要做的事情(使用超时来执行我的操作,因为有两个apply
次调用)。但现在,选择不会变得干净,选定的选项仍然存在。之前,它已被清理,但触发了错误。
scope.$watch(attrs.clean, function(value) {
if ( value ) {
$timeout(function() {
// Got from https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
if ( scope.$eval(attrs.clean) ) {
$(element).val(null);
$(element).trigger("change");
}
}, 0, false);
}
});
有更好的方法吗?这个timeout
电话听起来很奇怪(并且不起作用!)