【发布时间】:2013-11-26 01:07:59
【问题描述】:
你知道如何在一个 Dart 脚本中使用多个“聚合物元素”吗?
我成功了,但我不确定这是最好的解决方案。
我的示例是使用 Dart/WebUI 实现以下示例的 Dart/Polymer: https://www.dartlang.org/articles/web-ui/#loops
它显示一个聚合物元素(“example-template1”)中的水果列表,我们可以在其中研究另一个聚合物元素(“example-template2”中的特定水果”)。第二个聚合物元素必须通过数据绑定更新第一个。
为此,我声明遵循我的聚合物元素。一个名为“example-script”的父聚合物元素(因为我们只能在聚合物模板文件中使用一个脚本声明),以及从该父元素扩展的子元素:
<polymer-element name="example-script">
<script type="application/dart" src="tute.dart"></script>
</polymer-element>
<polymer-element name="example-template1" extends="example-script">
<template>
<div>
<p>Search fruit</p>
<input type="text" class="form-control" value="{{ research }}" on-input="{{ get_results }}">
</div>
</template>
</polymer-element>
<polymer-element name="example-template2" extends="example-script">
<template>
<div><ul>
<template repeat="{{ fruit in fruits }}">
<li>{{ fruit }}</li>
</template>
</ul></div>
</template>
</polymer-element>
我的 Dart 脚本如下:
import 'package:polymer/polymer.dart';
import 'dart:html';
@CustomTag('example-script')
class FruitsScript extends PolymerElement {
static List<String> fruitsList = new List();
@observable static List<String> fruits = toObservable(fruitsList);
@observable static String research = '';
FruitsScript.created() : super.created();
}
@CustomTag('example-template1')
class FruitsResearch extends FruitsScript {
FruitsResearch.created() : super.created();
String get research {
return FruitsScript.research;
}
String set research(String search) {
FruitsScript.research = search;
}
void get_results(Event e, var detail, Node target) {
FruitsScript.fruits.clear();
if (FruitsScript.research.length > 0) {
var lResearch = FruitsScript.research.toLowerCase();
var results = FruitsScript.fruitsList.where((v) => v.toLowerCase().contains(lResearch));
FruitsScript.fruits.addAll(results);
}
else {
FruitsScript.fruits.addAll(FruitsScript.fruitsList);
}
}
}
@CustomTag('example-template2')
class FruitsDisplay extends FruitsScript {
FruitsDisplay.created() : super.created() {
List<String> fruits = [ 'Apple', 'Apricot', 'Avocado'];
FruitsScript.fruitsList.clear();
FruitsScript.fruitsList.addAll(fruits);
FruitsScript.fruitsList.sort();
FruitsScript.fruits.clear();
FruitsScript.fruits.addAll(FruitsScript.fruitsList);
}
List<String> get fruits {
return FruitsScript.fruits;
}
}
我声明一个父类“FruitsScript”来初始化可观察变量。然后,我为我的两个聚合物元素“example-template1/2”创建了另外两个类。因此我可以访问我的可观察变量。但为此,我还需要将它们声明为 static,并在我的子类中将 setters 设为 getters,否则我的聚合物元素不能共享可观察变量。
这个方法行得通,但你认为有更好的方法吗?
【问题讨论】:
-
我很好奇你为什么只想使用一个脚本。
-
我只使用一个脚本就能够在我的多个聚合物元素之间共享我的可观察变量。因此,我希望一个元素(example-template1)上的数据绑定更新另一个元素(example-template2)。但也许我走错路了;我是聚合物世界的新手 :)
标签: dart dart-polymer