更新在底部 我写了一个过滤器来管理我在我的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,所以为了保存我的理智,我排除了这一点。
我已经将此作为bug提交给Angular.js人员,并将提交给MS,因为浏览器在任何情况下都不应该崩溃。 https://github.com/angular/angular.js/issues/7159 – Brian
MS崩溃报告https://connect.microsoft.com/IE/feedback/details/856775/browser-crash-when-it-doesnt -like-an-angular-js-event – Brian
添加了一个plunker页面。但是,页面并未触发问题。所以我慢慢地加入其他功能,直到我崩溃。 http://plnkr.co/edit/oCLDKeCEmtuf4FwpURy3 – Brian