底部的更新 我写了一个过滤器来管理我在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,因此我将其删除以保存我的理智。
答案 0 :(得分:0)
放
<html xmlns:ng="http://angularjs.org">
或
<html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
答案 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选项卡替换它们。