Angular Dart 教程的主要运行示例是一个食谱书应用程序。第 5 章末尾关于过滤器和服务的练习建议尝试“创建一个 [自定义] 过滤器,它将食谱中 [列出的每种成分] 的所有数量相乘”,从而允许“用户翻倍、三倍或把食谱翻两番。” 例如,“1/2 杯面粉”的成分在翻倍时会变成“1 杯面粉”。
我编写了这样一个自定义过滤器:它需要一个Ingredient
s 列表(由 aquantity
和 a组成description
)并返回一个新的 new Ingredient
s 列表(数量增加),但我收到以下错误:
5 $digest() iterations reached. Aborting!
我的问题是:AngularDart 自定义过滤call()
方法的要求和/或允许的行为是什么?例如,显然允许从其输入列表中删除(即过滤)元素,但它也可以添加新元素或替换元素吗?Dart angular.core NgFilter文档只是说“过滤器是一个带有调用方法的类”。我还没有找到更多细节。
从这个 AngularJS 帖子的答案推断,似乎重复调用call()
应该(最终?)产生“相同的结果”。如果是这样,这将是一个合理的约束。
产生“相同的结果”可能意味着call()
需要是幂等的,但在 Dart 的情况下,这种幂等性应该是相对于==
(对象等价)而不是identical()
(对象身份),恕我直言。我使用以下小示例进行了一些测试来说明问题:
- 主要.dart
import 'package:angular/angular.dart';
class A { }
@NgFilter(name:'myFilter') class MutatingCustomFilter {
final A _a = new A();
call(List list) => new List.from(list)..add(_a); // runs ok.
// call(List list) => new List.from(list)..add(new A()); // gives error
}
class MyAppModule extends Module {
MyAppModule() { type(MutatingCustomFilter); }
}
main() => ngBootstrap(module: new MyAppModule());
- index.html 摘录
<ul>
<li ng-repeat="x in [1,2,3] | myFilter">{{x}}</li>
</ul>
如果我改变class A
身体
@override bool operator==(other) => true;
@override int get hashCode => 1;
这使得所有实例都A
被考虑==
过,那么 call()
main.dart 中的第二个实现(带有 的那个add(new A())
)仍然会给出一个错误(尽管是一个不同的)。
我可以看到如何在不使用自定义过滤器的情况下解决教程练习,但我试图不放弃寻找可以按要求工作的过滤器的挑战。我是 Angular 的新手,并决定加入 AngularDart,因此在解释 的各种风格的效果call()
或查找 , 的预期行为的文档方面有任何帮助call()
(或者让我知道您是否认为这样的自定义过滤器根本无法被写!)将不胜感激。