【发布时间】:2014-03-13 20:38:37
【问题描述】:
在我们的 Angular-dart 应用程序中,定义了一些组件(@NgComponent)。第一次显示这样的组件时,它会正确显示。从第二次开始,有时该组件会显示在 Web 应用程序中,有时则不会。调试表明,即使未显示,组件的代码也会被执行。似乎没有发生异常/堆栈跟踪。 当试图追查问题时,我们让组件实现 NgShadowRootAware 并添加方法 void onShadowRoot(ShadowRoot shadowRoot) {}。每次在 onShadowRoot 方法中放置断点时,组件都会正确显示。当断点被移除时,大多数时候组件 html 不会显示在 web 应用程序中。
显然,调整(多次)浏览器窗口的大小似乎会使组件显示出来。
view_objectdata_component.dart
library view_objectdata_component;
import 'package:angular/angular.dart';
import 'dart:html';
import '../model/model.dart';
@NgComponent(
selector: 'view-objectdata',
cssUrl: '../lib/component/view_objectdata_component.css',
templateUrl: '../lib/component/view_objectdata_component.html',
publishAs: 'cmp'
)
class ViewObjectDataComponent implements NgShadowRootAware {
@NgTwoWay('objectdata-map')
Map<String, ObjectData> dataMap;
@NgTwoWay('readonly')
bool readonly = true;
@NgTwoWay('editLink')
String theEditLink;
String _id;
ViewObjectDataComponent(RouteProvider routeProvider) {
_id = routeProvider.parameters['id'];
}
bool get hasEditLink => theEditLink != null;
String get editLink => theEditLink.replaceAll('<id>', _id);
ObjectData get data {
ObjectData val = dataMap[_id];
return val;
}
List<ObjectAttribute> get attributes {
List<ObjectAttribute> list = [];
for (ObjectAttribute simAtt in data.attributes.values) {
list.add(simAtt);
}
return list;
}
void onShadowRoot(ShadowRoot shadowRoot) {
shadowRoot.querySelector('#myDiv').children.add(
new SpanElement()..text = ''
);
}
}
view_objectdata_component.html
<div id='myDiv'>
<h3>{{cmp.data.getAttVal('Name')}}</h3>
<div><strong>ID: </strong>{{cmp.data.id}}</div>
<ul>
<li ng-repeat="att in cmp.attributes">
<view-attributevalue objectattribute="att" readonly="cmp.readonly"></view-attributevalue>
</li>
</ul>
<span ng-if="cmp.hasEditLink">
<a class="extra-space" href="{{cmp.editLink}}">
<input type="button" value="Edit">
</a>
</span>
</div>
调用者:
{{ctrl.changeMainSection('applications')}}
<div>
<br/>
<div class="alert alert-info alert-dismissable fade in">
<view-objectdata
objectdata-map="ctrl.asDataMap(ctrl.applications)" editLink="'#/appComp/<id>/edit'"
>
</view-objectdata>
</div>
</div>
【问题讨论】:
-
很可能是时间问题。可以发一些代码吗?
-
我在帖子中添加了一些代码。如果需要,我可以提供一个 zip 文件,其中包含与一些本地演示数据一起运行的项目代码。版本:Dart 编辑器版本 1.2.0.release (STABLE) / angular 0.9.8
-
你能用源代码创建一个 GitHub 存储库吗?我还不明白的是你如何“第二次”“展示”组件。
-
代码应位于:github.com/hbkn/lndscp/tree/master/lndscp。 => 单击应用程序以显示特定细节(=由组件实现)。顺便说一句:显然,调整浏览器窗口的大小(多次)可能会使组件显示出来。
-
我可以重现该问题。我还没找到原因。
标签: dart angular-dart