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