【发布时间】:2015-06-21 01:33:09
【问题描述】:
我为这个很棒的 jquery 插件 jQuery-Select2 创建了简单的自定义 AngularJs 指令,如下所示:
指令
app.directive("select2",function($timeout,$parse){
return {
restrict: 'AC',
link: function(scope, element, attrs) {
$timeout(function() {
$(element).select2();
},200);
}
};
});
在 HTML 模板中的使用:
<select class="form-control" select2 name="country"
data-ng-model="client.primary_address.country"
ng-options="c.name as c.name for c in client.countries">
<option value="">Select Country</option>
</select>
它按预期工作,我的正常 select 元素被 select2 插件替换。
但是有一个问题,有时它会显示默认值,即Select Country,尽管在下拉列表中自动选择了正确的模型值。
现在,如果我将 $timeout 间隔从 200 增加到某个较高的值,例如 1500,它正在工作,但会延迟指令的呈现。另外我认为这不是正确的解决方案,因为我的数据是通过 ajax 加载的。
我也尝试过如下更新指令,但也没有运气:
app.directive("select2",function($timeout,$parse){
return {
restrict: 'AC',
require: 'ngModel',
link: function(scope, element, attrs) {
var modelAccessor = $parse(attrs.ngModel);
$timeout(function() {
$(element).select2();
});
scope.$watch(modelAccessor, function (val) {
if(val) {
$(element).select2("val",val);
}
});
}
};
});
PS:我知道ui-select 存在类似的模块,但它需要<ui-select></ui-select> 形式的一些不同标记,并且我的应用程序已经完全开发,我只想用select2替换普通选择框。
那么您能否指导我如何解决此问题并确保该指令与最新行为保持同步?
【问题讨论】:
-
这和
select2有关系吗?如果您删除select2指令,并使其成为正常的选择元素,它是否按预期工作? -
是的,如果我删除它,它会按预期工作。
-
我也在我的应用程序中使用
select2,但我使用的是ui-select2,它是Angular 的包装器,现在已弃用。顺便说一句,Select2给我带来了很多悲伤,我建议你尽量避免:) -
@OmriAharon 使用
ui-select2比创建自己已经编写好的库更好。 -
@pankajparkar 是的,我建议使用推荐的
ui-select。
标签: javascript jquery angularjs angularjs-directive jquery-select2