【问题标题】:Angular-dart component not always shown in web appAngular-dart 组件并不总是显示在 Web 应用程序中
【发布时间】: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


【解决方案1】:

我认为,当您的数据(应用程序)从 queryService 异步加载时,此更新不会触发整个依赖链。当您有一个断点时,加载数据同时完成,然后显示所有内容。如果您没有断点,Angular 会完成渲染,并且不知何故无法识别数据更改。

您的代码中有一些 Angular 不喜欢的模式可能会导致这种行为。 (如果你升级到 Angular 0.9.9 你会得到一些例外)

有几种方法可以用来做类似的事情

List&lt;ApplicationComponent&gt; get applications 每次都会创建一个新列表。
String tabClassForMainSection(String section) Angular 似乎不喜欢这样的代码(不确定这是否应该工作)可能是 Angular 中的一个错误 (https://github.com/angular/angular.dart/issues/738)。
@ 987654332@ 每次被调用时都会返回一个新集合。

也许您应该考虑使用不同的策略来加载数据。 您可以将 QueryService 注入组件并创建一个异步 getApplications 方法,您可以从组件中调用该方法,例如 queryService.getApplications().then((data) =&gt; updateApplications(data));

当您查看我在此处https://github.com/angular/angular.dart/issues/738 发布的调试输出时,您会看到 Angular 调用方法以检查数据更新的频率。如果每次都创建一个新的集合是非常低效的。这就是 0.9.9 不再支持它的原因。

我希望这会有所帮助。

【讨论】:

  • 非常感谢您的调查和反馈。我会根据你的评论修改代码。顺便说一句:通常,当浏览器窗口重新调整大小时(但不是所有时间)都会显示组件,所以我不确定问题是否完全由数据加载方式引起。通常,当浏览器窗口变小并放大时,组件内容就会显示出来。谢谢,我会及时通知您(通过此线程)结果。
  • 我认为 Angular 会重新评估某些操作的数据,然后当它看到数据发生变化时会更新视图。但这并非在您的应用程序所需的所有情况下都完成,因此有时不会显示任何内容。
  • 你可以看看docs.google.com/document/d/…en.wikipedia.org/wiki/Pure_function。看来 Angular 需要纯函数(总是为相同的参数返回相同的值)
  • 代码已根据备注进行了修改,并使其在 angular dart 0.9.9 上运行良好。尽管如此,同样的问题仍然存在:即使 chrome shadow dom 查看器指示组件的 html 代码已正确生成,组件的 html 视图也不总是显示。在这种情况下,调整浏览器窗口的大小(通常是更改宽度以使其更窄)会使组件内容显示出来。代码已上传 github.com/hbkn/lndscp (v00.02) angular dart 0.9.9 - Dartium 版本 33.0.1750.48 (251129) - Dart 编辑器版本 1.2.0.release (STABLE)
  • 您是否尝试过构建到 JS 并检查它是否在那里工作?我怀疑这是一个 Dartium 问题。我已经对 Dartium 中的 Polymer 元素有类似的行为。该应用程序似乎运行良好。所有内容在开发工具中都是可见的。我看到在调整浏览器大小时,一些::before ::after 被添加到每个&lt;div ng-repeat="att in cmp.data.attributeList" class="form-group"&gt; 中。我猜这是 Dartium/ShadowDOM 的一些 CSS 问题
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2018-01-11
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多