【问题标题】:Cannot observe properties of nested elements in Safari 8.0 (iPad, iOS 8.1.3) in Polymer.dart在 Polymer.dart 中无法观察 Safari 8.0(iPad、iOS 8.1.3)中嵌套元素的属性
【发布时间】:2015-02-05 18:26:38
【问题描述】:

我正在尝试观察嵌套 Dart PolymerElements 的属性变化。 它适用于 Firefox、Chrome,但不适用于 iPad 上的 Safari 8.0 (iOS 8.1.3)

index.html 文件:

<!DOCTYPE html>

<html>
<head>
  <title>Test</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="mobile-web-app-capable" content="yes">
  <link rel="import" href="parent_element.html">
</head>
<body unresolved fullbleed>

  <parent-element></parent-element>

  <script type="application/dart">export 'package:polymer/init.dart';</script>
  <script src="packages/browser/dart.js"></script>
</body>
</html>

parent_element.html 文件:

<link rel="import" href="packages/polymer/polymer.html">
<link rel="import" href="packages/core_elements/core_header_panel.html">
<link rel="import" href="packages/core_elements/core_toolbar.html">
<link rel="import" href="packages/paper_elements/paper_icon_button.html">
<link rel="import" href="packages/paper_elements/paper_button.html">
<link rel="import" href="child-element.html">

<polymer-element name="parent-element">
  <template>
    <style>
      :host, core-header-panel {
        height: 100%;
      }
    </style>
    <core-header-panel mode="waterfall" flex>
      <core-toolbar class="small">
        <div>Observed value in parent is {{logged}}</div>
        <span flex></span>
        <div id="message"></div>

        <child-element id="login-box" logged="{{logged}}"></child-element>
        <paper-button on-click="{{doLogin}}" raised hidden?="{{logged}}">Login</paper-button>
        <paper-button on-click="{{doLogout}}" raised hidden?="{{!logged}}">Logout</paper-button>

      </core-toolbar>
    </core-header-panel>
  </template>
  <script type="application/dart" src="parent-element.dart"></script>
</polymer-element>

parent-element.dart 文件:

@CustomTag('parent-element')
class ParentElement extends PolymerElement {

  ChildElement childElement;

  @observable bool logged = false;

  ParentElement.created() : super.created() {
    //while(children.length > 0) {
    //  shadowRoot.append(children[0]);
    //}
    childElement = (shadowRoot.querySelector('#login-box') as ChildElement);
  }

  void loggedChanged() {
    print('loggedChanged: $logged');
  }

  void doLogin(Event e, var details, Node node) {
    childElement.doLogin();
  }

  void doLogout(Event e, var details, Node node) {
    childElement.doLogout();
  }
}

child-element.html 文件:

<link rel="import" href="packages/polymer/polymer.html">
...
<polymer-element name="child-element">
  <template>
    <style>
    </style>

    <paper-action-dialog id="login-dialog" heading="Login to.." transition="core-transition-center" backdrop="" layered="true">
      <p>Observed value in child is ({{ logged }})</p>
      <paper-button affirmative>Cancel</paper-button>
      <paper-button id="login-button" affirmative autofocus >Join</paper-button>
    </paper-action-dialog>

  </template>
  <script type="application/dart" src="child-element.dart"></script>
</polymer-element>

child-element.dart 文件:

@CustomTag('child-element')
class ChildElement extends PolymerElement {
  bool _loginListen = false;
  @published bool logged;

  ChildElement.created() : super.created() {
    // I can't set onClick listen here because login-button doesn't exists yet. Why?
    //var loginBtn = ($['login-button'] as PaperButton); ==> null
    //var loginBtn1 = (querySelector('#login-button') as PaperButton); ==> null
  }

  void doLogin() {
    if (!_loginListen) {
      PaperButton button = (shadowRoot.querySelector('#login-button') as PaperButton);
      button.onClick.listen((Event e) {
        _login(e);
      });
      _loginListen = true;
    }

    PaperDialogBase dialog = (shadowRoot.querySelector('#login-dialog') as PaperDialogBase);
    dialog.toggle();
  }

  void _login(Event event) {
    print('Login...');
    logged = true;
  }

  void doLogout() {
    print('Logout...');
    logged = false;
  }

}

pubspec.yaml 文件:

name: test
version: 0.0.1
description: Test of observers
dependencies:
  paper_elements: 0.6.1
  polymer: ">=0.15.0 <0.16.0"
  browser: 0.10.0
transformers:
- polymer:
    entry_points: web/index.html

当我单击“JOIN”按钮(在子元素中)时,它会触发“loggedChanged”(在父元素中)并更改文本“父元素中的观察值”(但在 iPad 上的 Safari 中没有强>)。

请告知如何修复它。非常感谢。

附言我尝试使用“数据对象”而不是“布尔记录”:

class DataObject extends Observable {
  @observable bool logged = false;
}

但我得到了同样的效果。

【问题讨论】:

  • 不,我这里没有 main(),但我尝试了 void main() { initPolymer(); }
  • 在我发表评论后,我在index.html 中看到了脚本标签,这已经很清楚了。

标签: dart dart-polymer observable


【解决方案1】:

你应该避免在元素构造器中访问 DOM

childElement = (shadowRoot.querySelector('#login-box') as ChildElement);

此代码应移至ready 等生命周期方法之一(child-element 中已注释掉的代码也是如此)。

我不知道这是否真的解决了您的问题,但这是您问题中唯一看起来不正确的部分。

【讨论】:

  • 我应该在 index.dart 的 main() 中还是在父元素中的某个地方做?
  • 不,最好完全避免main()(太容易导致显式初始化错误)。见polymer-project.org/docs/polymer/polymer.html#lifecyclemethods
  • Günter,你能解释一下,是否可以一起使用 &lt;script&gt; Polymer('parent-element', { ready: function() { console.log('parent-element is ready!'); } }); &lt;/script&gt;&lt;script type="application/dart" src="parent-element.dart"&gt;&lt;/script&gt; 在运行时我有“未捕获的异常:已经为元素父元素注册(聚合物)原型”
  • 您添加了 JavaScript 代码(我发布的链接是针对Polymer.js 而不是Polymer.dart)。我试图找到Polymer.dart 的文档,但分心了。更重要的部分是调用这些方法时的信息,Polymer.dartPolymer.js 也是如此。只需添加一个方法ready() { ... } 并在此处添加您的代码。一些方法(attached/detached)覆盖了基类的方法,在这里添加对超级实现的调用很重要(@override attach() {super.attached(); ...}`但是@据我所知,987654337@ 没有。
  • ready 也覆盖了基类 PolymerElement 中的一个方法,但它在那里没有实现,所以不管你调用 super.ready(); 还是不调用 stackoverflow.com/questions/22122280/…
【解决方案2】:

我已经创建了一个错误报告 https://code.google.com/p/dart/issues/detail?id=22275 以及测试样本。

UPD:这种效果是由于 paper-action-dialog 中的 paper-button 上存在肯定或不屑一顾的属性。 没有它们,父元素会观察子元素中属性的变化。 我已将 paper-action-dialog 替换为 paper-dialog,它适用于 Safari。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2012-02-15
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多