【发布时间】:2014-02-14 20:59:10
【问题描述】:
Angular Dart 教程的主要运行示例是一个Recipe Book 应用程序。 Chapter 5 on filters and services 末尾的练习建议尝试“创建一个 [自定义] 过滤器,将配方中 [列出的每种成分] 的所有数量相乘”,从而允许“用户可以将食谱翻倍、三倍或四倍。”例如。 “1/2杯面粉”的成分加倍后会变成“1杯面粉”。
我编写了这样一个自定义过滤器:它需要一个Ingredients 列表(由一个quantity 和一个description 组成)并返回一个新的Ingredients 列表(数量增加),但我收到以下错误:
5 $digest() iterations reached. Aborting!
我的问题是:AngularDart 自定义过滤器call() 方法的要求和/或允许的行为是什么?例如,显然允许从其输入列表中删除(即过滤)元素,但它也可以添加新元素或替换元素吗? Dart angular.core NgFilter 文档简单地说“过滤器是一个带有调用方法的类”。我没有找到更多细节。
从this AngularJS post 的答案推断,似乎重复调用call() 应该(最终?)产生“相同的结果”。如果是这样,这将是一个合理的约束。
产生“相同的结果”可能意味着call() 需要幂等,但在 Dart 的情况下,这种幂等性应该相对于==(对象等价)而不是identical() (对象身份),恕我直言。我使用以下小示例进行了一些测试来说明问题:
- main.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 的所有实例都被视为==,然后main.dart 中call() 的第二个实现(带有add(new A()) 的那个)仍然给出错误(尽管是不同的)。
我可以看到如何在不使用自定义过滤器的情况下解决教程练习,但我试图不放弃寻找可以按要求工作的过滤器的挑战。我是 Angular 的新手,并决定加入 AngularDart,因此在解释 call() 的各种风格的效果或查找 call() 的预期行为的文档方面有任何帮助,(或者让我知道你是否认为这样的自定义过滤器根本无法编写!)将不胜感激。
【问题讨论】:
标签: filter dart semantics angular-dart idempotent