【发布时间】:2016-08-22 15:44:02
【问题描述】:
你好 Dart 和 Angular 的人们, 以下问题:
我的 app_component.html 中有以下模板部分,这是我的 app_component.dart 自定义组件的模板。
<!-- monitoring active breakpoints-->
<jb-responsive-breakpoints [breakpoints]="breakpoints"
[(activeBreakpoints)]="activeBreakpoints">
</jb-responsive-breakpoints>
<!-- using list of active breakpoints -->
<jb-menu [activeBreakpoints]="activeBreakpoints">
<!--some menu items, irrelevant for this problem-->
</jb-menu>
<!-- testing list of active breakpoints-->
Active Breakpoints:
<ul>
<li *ngFor="let breakpoint of activeBreakpoints;"> {{breakpoint}}</li>
</ul>
Jb-responsive-breakpoints 和 jb-menu 也是自定义组件。下面的 ul 测试 jb-responsive-breakpoints 的正确功能。
此模板中使用的变量“breakpoints”和“activeBreakpoints”在 app_component.dart 中定义,代码如下:
//Mapping from window min-width for this breakpoint to label
Map<int, String> breakpoints = {0:'small', 310:'medium', 450:'large', 600:'xlarge'};
List<String> activeBreakpoints = new List<String>();
应该发生什么:
- jb-responsive-breakpoints 为给定宽度注册监听器
- 如果窗口的当前宽度超过一个断点,“activeBreakpoints”列表将被更新。此列表包含所有当前活动的断点,例如 css 允许所有匹配的媒体查询一次处于活动状态
- 这似乎按预期工作,因为模板中的 ul 会相应更新。
问题:
jb-menu 应该获取 activeBreakpoints 列表以找出何时更改其外观。 jb-menu 上的 activeBreakpoints 属性是一个设置器,就像一个事件处理程序。
jb-menu 上的 activeBreakpoints 属性定义如下:
List<String> _activeBreakpoints;
@Input()
set activeBreakpoints(List<String> breakpoints) {
_log.finest("ActiveBreakpoints list changed");
_log.finest("Active Breakpoints: ${breakpoints.fold("", (prevVal, elem) => "$prevVal, $elem")}");
_activeBreakpoints = breakpoints;
}
get activeBreakpoints {
return _activeBreakpoints;
}
行为:
- 使用空列表调用 setter - 由于初始化而合乎逻辑
- 在进一步的断点更改时不会调用 Setter(可以通过日志消息证明这一点 - 调整窗口大小时没有“activeBreakpoints changed”日志消息)
- 令人困惑:在ngAfterViewInitfunction 的 jb-menu 组件中记录活动断点时,所有当前断点都按预期可见:
@override
ngAfterViewInit() {
_log.finest(
'''
currentBreakpoints: $activeBreakpoints
'''
);
}
这会产生:
currentBreakpoints: [small, medium, large, xlarge]
或更少的断点,取决于窗口大小。
我可以想象,这是由于两个组件中的列表引用相同。
但我的菜单组件依赖于被调用的 setter - 就像事件处理程序一样。
一些想法如何解决这个问题?
PS:如果需要更多代码/解释,请询问! :)
【问题讨论】:
标签: angular dart angular-dart angular2-directives