javascript - Angularjs 自定义 select2 指令

标签 javascript jquery angularjs angularjs-directive jquery-select2

我已经为这个很棒的 jquery 插件创建了简单的自定义 AngularJs 指令 jQuery-Select2如下:

指令

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对一些高值(value)的人说 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 替换普通的选择框。

那么您能否指导我如何解决此问题并确保该指令与最新行为保持同步?

最佳答案

它可能比你想象的要简单!

请看这个Plunker

基本上,所有的插件,Angularjs $watch 都需要基于一些东西。我不是 100% 确定 jQuery-select2;但我认为这只是控件的正常 DOM 事件。 (在 Angular $watch 的情况下,它是一个“脏检查循环”)

我的想法是让我们信任 jquery-Select2 和 AngularJS 来处理这些更改事件。

我们只需要观察 Angular 方式的变化并以 Select2 方式更新选择

var refreshSelect = function() {
    if (!element.select2Initialized) return;
    $timeout(function() {
        element.trigger('change');
    });
};

//...

scope.$watch(attrs.ngModel, refreshSelect);

注意:我添加了 2 款新 watch ,我认为您会喜欢!

关于javascript - Angularjs 自定义 select2 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644310/

相关文章:

javascript - jQuery scroll() 检测用户何时停止滚动

jquery - 使用带有切换事件的 jQuery .live

javascript - 如何通过多次调用在 Angular JS 服务或 Controller 中构建模型数据?

javascript - AngularJS ng-repeat 更新不起作用

javascript - 当浏览器下载所需文件时,GIF 在启动画面中缓慢动画

javascript - 尝试使用 jQuery 创建轮播效果

javascript - 使用 jQuery 验证和 AJAX 的 Bootstrap 联系表单

javascript - 将替换值从对象存储到另一个数组

javascript - 如何突出显示给定坐标的单词

javascript - 在 jQueryUI 中拖动一个按钮