自定义角度过滤器崩溃IE 9+

时间:2014-04-18 02:56:32

标签: javascript angularjs internet-explorer crash internet-explorer-10

底部的更新 我写了一个过滤器来管理我在ng-repeat中取代的东西。但是,当返回的数据应该是一个空数组时,在IE 9+中我会崩溃,但在FF和Chrome中它运行正常。

下面的BuildFilter是从angular.module('app').filter(filterId, buildFilter);

调用的
function buildFilter() {
    return function (input, limitTo, keyWords) {


        var outputPre = [];
        var outputPost = [];

        var d = new Date();
        console.log('filter event: '
            + d.getHours() + ":"
            + d.getMinutes() + ":"
            + d.getSeconds());

        var outputPre = [];
        if (!(limitTo === null
            || limitTo === undefined
            || limitTo === '')) {
            for (var i = 0; i < input.length; i++) {
                if (input[i] !== null && input[i] !== undefined) {
                    switch (limitTo) {
                        case 'edi':
                            if (input[i].dateReleased === null) {
                                outputPre.push(input[i]);
                            }
                            break;
                        case 'rel':
                            if (input[i].dateReleased !== null
                                && input[i].dateRetired === null) {
                                outputPre.push(input[i]);
                            }
                            break;
                        case 'ret':
                            if (input[i].dateRetired !== null) {
                                outputPre.push(input[i]);
                            }
                            break;
                        default:
                            outputPre.push(input[i]);
                    }
                }
            }
        }
        else {
            for (var i = 0; i < input.length; i++) {
                outputPre.push(input[i]);
            }
        }

        //Sanity Check Log Entry
        console.log('pre count: ' + outputPre.length);

        if (!(keyWords === null
            || keyWords === undefined
            || keyWords === '')) {
            var tkw = keyWords.toLocaleLowerCase();

            for (var i = 0; i < outputPre.length; i++) {

                var tn = outputPre[i].name.toLocaleLowerCase();

                if (tn.indexOf(tkw) > -1) {
                    outputPost.push(outputPre[i]);
                }
            }
        }
        else {
            for (var i = 0; i < outputPre.length; i++) {
                outputPost.push(outputPre[i]);
            }
        }

        //Sanity Check Log Entry
        console.log('post count: ' + outputPost.length);

        return outputPost;
    };
};

我的示例数据是:

var data= [ //for input
    {
        id: 0,
        dateCreated: '1/1/2014',
        dateReleased: null,
        dateRetired: null,
        name: 'Sample Data',
   },
   {
        id: 1,
        dateCreated: '1/1/2014',
        dateReleased: null,
        dateRetired: null,
        name: 'Other Sample Data',
    },
]

limitTo支持以下值:'edi''rel','ret'

keyWords只是任何字符串。它只是查看字符串的任何部分是否在名称字段中。

更新发布: 将代码减少到以下内容。

function isEdi(obj) {
    if ((obj.dateReleased === null)
        && (obj.dateRetired === null)) {
        return true;
    }
    return false;
}

function isRel(obj) {
    if ((obj.dateReleased !== null)
        && (obj.dateRetired === null)) {
        return true;
    }
    return false;
}

function isRet(obj) {
    if ((obj.dateReleased !== null)
        && (obj.dateRetired !== null)) {
        return true;
    }
    return false;
}

function buildFilter() {
    return function (input, limitTo) {

        var output = [];

        switch (limitTo) {
            case 'edi':
                output = input.filter(isEdi);
                break;
            case 'rel':
                output = input.filter(isRel);
                break;
            case 'ret':
                output = input.filter(isRet);
                break;
            default:
                output = input;
        }

        return output;
    };
};

当返回为[]时IE崩溃,但如果返回为至少1条记录则工作正常。

2ns更新发布:

将重复更改为ng-repeat="obj in objlist | filter:getObJFilter(objFilter) | orderBy:['+dateRetired','+dateReleased','+name']">

objFilter是一个让过滤函数传递给过滤器的参数。这样我只是扩展了本机过滤器,而不是创建一个新的过滤器。

所以我的控制器包含以下内容。

$scope.getFilter = function (val) {
    switch (val) {
        case 'edi':
            return isEdi();
            break;
        case 'rel':
            return isRel();
            break;
        case 'ret':
            return isRet();
            break;
        default:
            return function (obj) {return true };
   }
}

function isEdi() {
    return function(obj){
        if ((obj.dateReleased === null)
            && (obj.dateRetired === null)) {
            return true;
        }
        return false;
    }}

function isRel() {
    return function (obj) {
        if ((obj.dateReleased !== null)
            && (obj.dateRetired === null)) {
            return true;
        }
        return false;
    }
}

function isRet() {
    return function (obj) {
        if ((obj.dateReleased !== null)
            && (obj.dateRetired !== null)) {
            return true;
        }
        return false;
    }
}

我相信我已尽我所能消除过滤器作为问题。所以我现在到了我认为在IE中呈现空集的问题。

我今晚将在普兰克发布一个完整的测试示例。

注意:我也在使用AngularUI和Angular进行UI Bootstrap。获得所需指令的快捷方式。但是,我在其他问题上遇到了UI Bootstrap的问题,因此我将更换其中的一些组件来解决问题。

第三次更新我已删除所有第三方指令。我确实有用于支持TBS的UI Bootstrap,因此我将其删除以保存我的理智。

2 个答案:

答案 0 :(得分:0)

<html xmlns:ng="http://angularjs.org">

 <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">

Follow this

答案 1 :(得分:0)

这不是Angular.js的问题,而是使用UI.Bootstrap指令。 由于我无法在Plunker中复制该问题,因此我开始查看其他指令。消除了SPA中的选项卡控件,并将其替换为我自己的基于TBS的自定义选项卡。问题消失了。

进一步调查显示,这可能是由UI.Bootstrap选项卡中的递归问题引起的。所以我将记录我的发现,并发布到GitHub。

如果没有向Plunker发布代码的简单建议,我就不会发现这一点,所以我再次成为角色工作人员。

我的用户界面看起来像:

<tabset>
    <tab header="some header">
        <div ng-repeat="...">
            ...

因此,对于重复过滤器中的每次更改,tabset和tab指令都会被触发。所以我删除了tabset和tab,然后用标准的TBS选项卡替换它们。