Создайте приложение Polymer с несколькими элементами, используя один сценарий Dart.

Знаете ли вы, как использовать несколько «полимерных элементов» только с одним скриптом Dart?

Мне это удалось, но я не уверен, что это лучшее решение.

Мой пример представляет собой Dart/Polymer реализацию следующего примера с Dart/WebUI: 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". Следовательно, я могу получить доступ к своим наблюдаемым переменным. Но для этого мне также нужно объявить их как статические и сделать сеттеры геттерами в моих подклассах, иначе мои полимерные элементы не смогут разделить наблюдаемые переменные.

Этот метод работает, но как вы думаете, есть ли лучший способ сделать это?


person Alexandre    schedule 13.11.2013    source источник
comment
Мне любопытно, почему вы хотите использовать только один скрипт.   -  person Nathaniel Johnson    schedule 13.11.2013
comment
Я использую только один скрипт, чтобы иметь возможность обмениваться наблюдаемыми переменными между несколькими полимерными элементами. Следовательно, я хочу, чтобы привязка данных к одному элементу (example-template1) обновляла другой элемент (example-template2). Но, может быть, я на неправильном пути; Я новичок в мире полимеров :)   -  person Alexandre    schedule 13.11.2013


Ответы (1)


Как вы добавляете эти элементы на свою страницу? Насколько я понимаю, что вы хотите, наследование (расширение) не является подходящим решением. Я не пытался запустить этот код, просто отредактировал ваш код здесь, в текстовом поле. Если это то, что вы хотите сделать, но что-то не работает, напишите комментарий. Я не хотел тратить на это много времени, пока не ясно, чего именно вы хотите достичь.

На своей веб-странице вы размещаете свои элементы следующим образом:

<example-template1></example-template1>
<example-template2></example-template2>
<example-script></example-script>

Ваши элементы

<polymer-element name="example-script">
  <script type="application/dart" src="tute.dart"></script>
</polymer-element>

<polymer-element name="example-template1">
  <template>
    <div>
      <p>Search fruit</p>
      <input type="text" class="form-control" value="{{ model.research }}" on-input="{{ get_results }}">
    </div>
  </template>
</polymer-element>

<polymer-element name="example-template2">
  <template>
    <div><ul>
      <template repeat="{{ fruit in model.fruits }}">
        <li>{{ fruit }}</li>
      </template>
    </ul></div>
  </template>
</polymer-element>

Ваш скрипт Dart выглядит следующим образом:

import 'package:polymer/polymer.dart';
import 'dart:html';

class Model extends Object with Observable {
  @observable List<String> fruits = toObservable(new List<String>());
  @observable String research = '';
}

@CustomTag('example-script')
class FruitsScript extends PolymerElement {
  @published Model model = new Model();

  FruitsScript.created() : super.created();

  void attached() {
    super.attached();
    (document.querySelector('example-template1') as FruitsResearch).model = model;
    (document.querySelector('example-template2') as FruitsDisplay).model = model;
  }
}

@CustomTag('example-template1')
class FruitsResearch extends PolymerElement {
  FruitsResearch.created() : super.created();

  @published Model model;

  void get_results(Event e, var detail, Node target) {
    if (this.research.length > 0) {
      var lResearch = this.model.research.toLowerCase();
      var results = this.model.fruits.where((v) => v.toLowerCase().contains(lResearch));
      this.model.fruits = toObservable(results);
    }
  }
}

@CustomTag('example-template2')
class FruitsDisplay extends PolymerElement {
  @published Model model = new Model();

  FruitsDisplay.created() : super.created() {
    this.model.fruits = toObservable([ 'Apple', 'Apricot', 'Avocado']);
    this.model.fruits.sort();
  }
}
person Günter Zöchbauer    schedule 14.11.2013
comment
На самом деле, я хочу иметь возможность использовать несколько полимерных элементов с одними и теми же наблюдаемыми переменными. Более того, я хочу иметь возможность размещать эти элементы в нескольких местах на моей HTML-странице. Например, при публикации атрибутов я должен поместить два своих подэлемента в родительский элемент, чтобы совместно использовать наблюдаемые переменные. Но я не хочу этого. - person Alexandre; 17.11.2013
comment
Потому что, если бы я сделал это, мне пришлось бы поместить много моего HTML-кода в файл полимерного шаблона. Поскольку я использую другую структуру шаблонов для отображения своих HTML-страниц (jinja2), я не могу этого сделать. Вот почему я хочу определить свои HTML-страницы с помощью jinja2, а затем вставить в свои полимерные элементы, определенные в шаблонах Polymer. - person Alexandre; 17.11.2013
comment
Я обновил код в соответствии с вашими дополнительными требованиями. Вы также можете полностью удалить элемент example-script и переместить код из enterView, например, в main() или какую-то функцию с @initScript. - person Günter Zöchbauer; 18.11.2013
comment
Спасибо за решение: это работает! Я отредактировал ваш код, чтобы отразить тот, который я пробовал, и который в порядке. Я использую статические атрибуты вместо (document.querySelector(skills-display) as SkillsDisplay).model = model; в методе enterView, потому что в противном случае Dart показывает мне предупреждение. Большое спасибо;) Ваше решение красивее, чем моя первая попытка :) - person Alexandre; 24.11.2013
comment
Когда вы используете статическое поле (как при редактировании), элемент ‹example-script› является избыточным. Вам не нужен элемент для хранения статического поля. - person Günter Zöchbauer; 03.12.2013