在编辑列表时禁用AngularJS中的orderBy

I_D*_*ing 16 angularjs angularjs-orderby

orderBy在我的输入框列表中应用后,如果我编辑任何字段,它立即开始排序,我松散焦点.我尝试挖掘角度代码并发现他们在orderBy的属性上应用了类似于$ watch的东西,因此每当值更改时,它会对列表进行排序.是否有任何方法可以在编辑时禁用orderBy?我不想让orderBy在编辑文本时对数据进行排序.任何帮助将不胜感激

这是我的傻瓜

注意:我想使用orderBy并且不需要任何替代方法,例如从任何控制器本身对列表进行排序.我只是希望orderBy在页面加载时对列表进行一次排序,然后保持相当.

sur*_*lit 11

我正在使用orderBy可以使用angular-sortable重新排序的列表,并遇到了类似的问题.

我的解决方案是手动执行排序,通过orderBy在页面初始化时调用控制器内的过滤器,然后在必要时调用它,例如在重新排序列表后调用回调函数.

  • 官方文档中有一个例子:https://docs.angularjs.org/api/ng/filter/orderBy.搜索`var orderBy = $ filter('orderBy');`.不要忘记注入`$ filter`. (3认同)

Cai*_*nha 8

您可以覆盖指令以将更新时刻更改为您希望重新排序的时刻.您也可以不使用ng-model和依赖自定义指令.

该线程讨论覆盖输入指令以更改由tge blur事件触发的模型更新.看看小提琴.

虽然您可能会覆盖该指令,但您不应该这样做,并且@Liviu T.下面注释中解释和举例说明的最佳解决方案是创建一个自定义指令,删除事件键盘绑定并添加一个模糊.这是指令代码,这里是Liviu的plunker:

app.directive('modelChangeBlur', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
            link: function(scope, elm, attr, ngModelCtrl) {
            if (attr.type === 'radio' || attr.type === 'checkbox') return;

            elm.unbind('input').unbind('keydown').unbind('change');
            elm.bind('blur', function() {
                scope.$apply(function() {
                    ngModelCtrl.$setViewValue(elm.val());
                });         
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)
<input type="text" ng-model="variable" model-change-blur/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于Angular事件不是名称空间,因此您必须删除以前添加的任何事件.

  • 我建议你不要覆盖,但添加一个新的指令,只在你需要的地方启用该行为http://plnkr.co/edit/yoUmEUMMzecNlbKmtgDq?p=preview (2认同)