当前位置: 首页 > 面试题库 >

角度:过滤器中的无限摘要循环

孟凯泽
2023-03-14
问题内容

我正在编写一个自定义Angular过滤器,该过滤器随机大写传递给它的输入。

这是代码:

angular.module('textFilters', []).filter('goBananas', function() {
  return function(input) {

    var str = input;
    var strlen = str.length;

    while(strlen--) if(Math.round(Math.random())) {
      str = str.substr(0,strlen) + str.charAt(strlen).toUpperCase() + str.substr(strlen+1);
    }

    return str;
  };
});

我这样称呼它:

    <a class='menu_button_news menu_button' ng-href='#/news'>
        {{"News" | goBananas}}
    </a>

它可以工作,但是在我的控制台中,我看到了rootScope:infdig(无限摘要)循环。

我在理解为什么会发生这种情况以及如何解决此问题时遇到了一些麻烦。如果我理解正确,这是由于该函数调用了5个以上摘要操作。但是输入仅由过滤器调用一次,对吗?

任何帮助表示赞赏。


问题答案:

由于摘要将继续运行,直到达到模型的一致状态或将运行10次迭代,因此您需要使用自己的算法来生成伪随机数,该伪随机数将为相同的字符串返回相同的数,以避免无限的摘要循环。如果算法将使用字符值,字符位置和一些可配置的种子来生成数字,那将是很好的。避免在此类算法中使用日期/时间参数。这是可能的解决方案之一:

的HTML

<h1>{{ 'Hello Plunker!' | goBananas:17 }}</h1>

的JavaScript

angular.module('textFilters', []).
  filter('goBananas', function() {
    return function(input, seed) {
      seed = seed || 1;
      (input = input.split('')).forEach(function(c, i, arr) {
        arr[i] = c[(c.charCodeAt(0) + i + Math.round(seed / 3)) % 2 ? 'toUpperCase' : 'toLowerCase']();
      });
      return input.join('');
    }
  });

您可以使用seed参数来更改算法。例如,它可以是$indexngRepeat

Plunker:http://plnkr.co/edit/oBSGQjVZjhaIMWNrPXRh?p
= preview



 类似资料:
  • 问题内容: 我想实现一个过滤器来执行身份验证,但是不知何故它陷入了无限循环中……任何想法都值得赞赏。 调试模式下的这段代码仅无限次运行,基本上,我想在用户未登录时将其重定向到login.jsp。任何答复表示赞赏。 问题答案: 这里, 您将向目标页面发送 新的 HTTP请求,而不是使用当前请求。如果此新的HTTP请求被映射到过于通用的网址格式(例如),则当然会再次点击过滤器。并且将执行相同的检查,并

  • 问题内容: 我想在ng-repeat属性中调用函数,这是我的代码 示例plnkr html js 当我打开控制台时,我注意到了错误 我的代码的主要目标是在ng-repeat中使用函数来计算每个事件循环中的数据 问题答案: 找到了解决方案:

  • 问题内容: 我想在 angularjs 1.2中 使用unsafe-html 。没有html的过滤器可以工作,而html则不能。我做的事: 我在我的html头中添加了angular-sanitize: 我的角度模块: 我的HTML: 编辑:更新为 问题答案: 已在Angular 1.2中删除。由于您正确地清理了输入内容,因此应该使用。 示例:http://plnkr.co/edit/0bHeXra

  • 我有完全合法的数据来源: 我将其显示在这样的表中: 现在假设我想过滤我的数组。如果我有固定的行数,我可以在< code>tr元素上使用< code>*ngIf来选择显示/不显示一个项目,但是Angular不允许在一个元素上有两个结构指令。 我知道我可以使用< code>Array.filter简单地过滤源数组,但是这样会产生一个副本,如果我的数组大得多,这可能会成为一个问题。 我想将该行嵌套在某个

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?

  • 依赖项:Spring Boot 1.1.5。释放,Spring4.0.6。Spring安全释放装置3.2.4。释放 问题:我正在创建一个自定义过滤器,该过滤器基于请求中的令牌查询提供者以验证用户。这里有自定义筛选器代码和配置。正如你所看到的,我已经尽可能地禁用了以查明问题。启用调试显示 另一件事是日志告诉我用户已通过身份验证。 当查询应用程序时,会发生无限循环并最终返回请求,curl说它无法遵循那