【问题标题】:How to call method of the polymer element instance from outside?如何从外部调用聚合物元素实例的方法?
【发布时间】:2015-11-04 00:08:09
【问题描述】:

我在 dart lang 上从头开始新项目,遇到了聚合物元素实例调用方法的问题。

例如我有 fps-counter 元素(fpsCounter.dart):

@HtmlImport('fps_counter.html')
library fpsCounter;
import 'package:web_components/web_components.dart' show HtmlImport;
import "package:polymer/polymer.dart";
import "dart:html";

@CustomTag("fps-counter")
class FpsCounter extends PolymerElement
{
    @observable
    int fps;

    // counter that will cleared at 60 ticks
    int _counter = 0;

    // accumulator delta time for 60 ticks
    int _accumulator = 0;

    factory FpsCounter() => new Element.tag('fps-counter');

    FpsCounter.created() : super.created() {
        polymerCreated();
    }

    bool calculateFps(double delta)
    {
        if (_counter == 60)
        {
            fps = (60000 / _accumulator).round();
            _counter = 0;
            _accumulator = 0;

            print("$fps FPS");

            return true;
        }

        _accumulator += delta;
        _counter++;

        return false;
    }
}

并且想从外部调用calculateFps(0.016),如下例所示:

void _initRenderer(OSE ose)
{
    FpsCounter fpsCounter = new FpsCounter();
    fpsCounter.calculateFps(0.016);
    document.body.children.add(fpsCounter);

}

但面临问题:

Exception: Uncaught Error: Class 'HtmlElement' has no instance method 'calculateFps'.

我真的不想围绕它创建额外的沟通,任何想法如何使它更好或如何调用方法?谢谢。

还请查看可以提供帮助的其他文件:

pubspec.yaml

name: os
version: 0.0.1
dependencies:
  browser: ">=0.10.0 <0.11.0"
  ose:
    path: ./libs/ose
  polymer: any
transformers:
  - polymer

fps-counter.html

<link rel="import" href="packages/polymer/polymer.html" />
<polymer-element name="fps-counter">
    <template>
        <div>
            {{fps}} FPS
        </div>
    </template>
    <script type="application/dart" src="fpsCounter.dart"></script>
</polymer-element>

【问题讨论】:

  • 这通常是可行的。必须有一些错误阻止元素成为真正的FpsCounter。您可以创建项目的公共 GitHub 存储库吗?
  • 你不需要在构造函数中调用polymerCreated();,除非你的元素扩展了一个DOM元素(比如输入)。我预计这会导致问题。
  • 谢谢,我将删除polymerCreated(),但问题没有解决。
  • 请创建一个 GitHub 存储库,以便我能够正确调查。您的pubspec.yaml 是否在polymer 转换器部分包含您的入口页面?我不知道您上面的pubspec.yaml 是否被截断,因为您认为内容与问题无关,或者实际上是否没有任何进一步的内容。
  • 我已经创建了临时仓库:github.com/AndyTyurin/os 感谢支持!

标签: dart polymer dart-polymer


【解决方案1】:

这看起来像是升级您的自定义元素失败,可能是由于缺少导入。否则FpsCounter fpsCounter = new FpsCounter(); 将返回一个真实的FpsCounter 实例,调用calculateFps(...) 将起作用。

添加到您的 fps_counter.dart 文件顶部:

@HtmlImport('fps_counter.html')
library some_library;
import 'package:web_components/web_components.dart' show HtmlImport;

需要在pubspec.yamlpolymertransformer部分添加入口页面

transformers:
  - polymer:
      entry_points:
      - web/index.html

你需要导入包含FpsCounter类的dart文件,否则你不能使用FpsCounter作为类型注解或者。

您需要保留 FpsCounter.created() : super.created() 构造函数,如果您不扩展 DOM 元素,请不要在其中调用 polymerCreated()

我还必须更改您的 main() 方法。您初始化 Polymer 的方式仅适用于 &gt;=1.0.0-rc.x,但使用 any 您不会获得预发布版本,而是获得 0.16.3+3。另见how to implement a main function in polymer apps

import 'os.dart';
import 'package:polymer/polymer.dart';
export 'package:polymer/init.dart';

@whenPolymerReady
init() async {
  OS os = new OS();
  os.start();
}

现在可以了

【讨论】:

  • 感谢您的回答。我认为还有另一个问题,我更新了问题顶部的代码并添加了其他文件以提供帮助。我在 IDE 中也有几个错误:1)[来自 HtmlFinalizer on os|web/components/fps/fps_counter.html 的警告]:第 1 行,web/components/fps/fps_counter.html 的第 1 列:(来自 html)意外开始标记 (html)。预期的 DOCTYPE。 2) [来自 HtmlFinalizer on os|web/index.html 的警告]:web/index.html 第 316 行,第 19 列:css 文件 lib/src/build/log_injector.css 被多次内联。
  • 这些错误应该已经修复了(最近不知道是哪个版本)。聚合物元素不需要&lt;!DOCTYPE ...&gt;
  • css file lib/src/build/log_injector.css was inlined multiple times 只是可能优化的提示,可以通过在pubspec.yaml 中添加一行来修复,例如polymer: inline_stylesheets: log_injector.css: false
  • 解决了 log_injector.css 的问题,谢谢!在我的 dartium 控制台底部,我得到了:Unsupported operation: Class is missing constructor FpsCounter.created
  • 哦,你让我开心。之后暂时什么都没有。我想将元素放入我的渲染器管道中,该管道每帧调用渲染方法(requestAnimationFrame),还想在更新之前为元素设置增量参数,以计算 fps(渲染器将调用 calculateFps 方法,然后将其显示在 dom 上)。总的来说,它将是基于精灵的小型游戏引擎,使用 webgl 的力量,这是我的小调查。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多