0

更新在底部 我写了一个过滤器来管理我在我的ng重复取代。但是,当返回的数据应该是一个空数组时,在IE 9 +中我会崩溃,但在FF和Chrome中它工作正常。自定义角度过滤器崩溃IE 9+

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' '相对', '保留'

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中呈现空集的问题。

我会在Plunkr今晚发布完整的测试示例。

注意:我也使用AngularUI和Angular进行UI Bootstrap。获取所需指令的捷径。但是,我在其他问题上遇到了UI Bootstrap的问题,所以我将替换更多的组件来隔离问题。

第3次更新我已经删除了所有第三方指令。我确实有UI Bootstrap来支持TBS,所以为了保存我的理智,我排除了这一点。

+0

我已经将此作为bug提交给Angular.js人员,并将提交给MS,因为浏览器在任何情况下都不应该崩溃。 https://github.com/angular/angular.js/issues/7159 – Brian

+0

MS崩溃报告https://connect.microsoft.com/IE/feedback/details/856775/browser-crash-when-it-doesnt -like-an-angular-js-event – Brian

+0

添加了一个plunker页面。但是,页面并未触发问题。所以我慢慢地加入其他功能,直到我崩溃。 http://plnkr.co/edit/oCLDKeCEmtuf4FwpURy3 – Brian

回答

0

这不是Angular.js一个问题,但与UI.Bootstrap指令。 因为我无法在Plunker中复制这个问题,所以我开始查看其他指令。将选项卡控件从SPA中删除,并用基于TBS的我自己的自定义选项卡替换它。问题消失了。

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

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

我的UI看起来像:

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

所以标签集和标签指令都拿到在每次改变我对重复过滤解雇。所以我删除了标签和标签,并用标准的TBS标签替换它们。

0

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

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

Follow this

+0

错误的答案,请重新阅读帖子。如果这是问题,那么它不适用于任何浏览器。 – Brian