| Index: template_binding/lib/template_binding.dart
|
| diff --git a/template_binding/lib/template_binding.dart b/template_binding/lib/template_binding.dart
|
| deleted file mode 100644
|
| index 88fa17be58e0e39b9ecd6a56c467314e9dfb88e1..0000000000000000000000000000000000000000
|
| --- a/template_binding/lib/template_binding.dart
|
| +++ /dev/null
|
| @@ -1,180 +0,0 @@
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -/**
|
| - * This library provides access to the Polymer project's
|
| - * [Data Binding](http://www.polymer-project.org/docs/polymer/databinding.html)
|
| - * Find more information at the
|
| - * [Polymer.dart homepage](https://www.dartlang.org/polymer-dart/).
|
| - *
|
| - * Extends the capabilities of the HTML Template Element by enabling it to
|
| - * create, manage, and remove instances of content bound to data defined in
|
| - * Dart.
|
| - *
|
| - * Node.bind() is a new method added to all DOM nodes which instructs them to
|
| - * bind the named property to the data provided. These allows applications to
|
| - * create a data model in Dart or JavaScript that DOM reacts to.
|
| - */
|
| -library template_binding;
|
| -
|
| -import 'dart:async';
|
| -import 'dart:collection';
|
| -import 'dart:html';
|
| -import 'dart:js' as js show context;
|
| -import 'dart:js' show JsObject;
|
| -import 'dart:svg' show SvgSvgElement;
|
| -import 'package:observe/observe.dart';
|
| -
|
| -import 'src/mustache_tokens.dart';
|
| -
|
| -part 'src/binding_delegate.dart';
|
| -part 'src/instance_binding_map.dart';
|
| -part 'src/node.dart';
|
| -part 'src/template.dart';
|
| -part 'src/template_iterator.dart';
|
| -
|
| -// TODO(jmesserly): ideally we would split TemplateBinding and Node.bind into
|
| -// two packages, but this is not easy when we are faking extension methods.
|
| -// Since TemplateElement needs to override Node.bind, it seems like the
|
| -// Node.bind layer must have some innate knowledge of TemplateBinding.
|
| -// NOTE: I've heard NodeBind might become an internal API, which is all the more
|
| -// reason to have it in this package.
|
| -
|
| -/**
|
| - * Provides access to the data binding APIs for the [node]. For example:
|
| - *
|
| - * templateBind(node).model = new MyModel();
|
| - *
|
| - * This is equivalent to [nodeBind], but provides access to
|
| - * [TemplateBindExtension] APIs. [node] should be a [TemplateElement], or
|
| - * equivalent semantic template such as:
|
| - *
|
| - * <table template repeat="{{row in rows}}">
|
| - * <tr template repeat="{{item in row}}">
|
| - * <td>{{item}}</td>
|
| - * </tr>
|
| - * </table>
|
| - */
|
| -TemplateBindExtension templateBind(Element node) => nodeBind(node);
|
| -
|
| -/**
|
| - * Like [templateBind], but intended to be used only within a custom element
|
| - * that implements [TemplateBindExtension]. This method can be used to simulate
|
| - * a super call. For example:
|
| - *
|
| - * class CoolTemplate extends TemplateElement
|
| - * implements TemplateBindExtension {
|
| - *
|
| - * createInstance(model, delegate) {
|
| - * // do something cool...
|
| - * // otherwise, fall back to superclass
|
| - * return templateBindFallback(this).createInstance(model, delegate);
|
| - * }
|
| - * ...
|
| - * }
|
| - */
|
| -TemplateBindExtension templateBindFallback(Element node) =>
|
| - nodeBindFallback(node);
|
| -
|
| -/**
|
| - * Provides access to the data binding APIs for the [node]. For example:
|
| - *
|
| - * nodeBind(node).bind('checked', model, 'path.to.some.value');
|
| - */
|
| -NodeBindExtension nodeBind(Node node) {
|
| - return node is NodeBindExtension ? node : nodeBindFallback(node);
|
| -}
|
| -
|
| -/**
|
| - * Like [nodeBind], but intended to be used only within a custom element that
|
| - * implements [NodeBindExtension]. This method can be used to simulate a super
|
| - * call. For example:
|
| - *
|
| - * class FancyButton extends ButtonElement implements NodeBindExtension {
|
| - * bind(name, model, path) {
|
| - * if (name == 'fancy-prop') ... // do fancy binding
|
| - * // otherwise, fall back to superclass
|
| - * return nodeBindFallback(this).bind(name, model, path);
|
| - * }
|
| - * ...
|
| - * }
|
| - */
|
| -NodeBindExtension nodeBindFallback(Node node) {
|
| - var extension = _expando[node];
|
| - if (extension != null) return extension;
|
| -
|
| - if (isSemanticTemplate(node)) {
|
| - extension = new TemplateBindExtension._(node);
|
| - } else {
|
| - extension = new NodeBindExtension._(node);
|
| - }
|
| - _expando[node] = extension;
|
| - return extension;
|
| -}
|
| -
|
| -
|
| -bool _isAttributeTemplate(Element n) => n.attributes.containsKey('template') &&
|
| - _SEMANTIC_TEMPLATE_TAGS.containsKey(n.localName);
|
| -
|
| -bool _isSvgTemplate(Element el) => el.tagName == 'template' &&
|
| - el.namespaceUri == 'http://www.w3.org/2000/svg';
|
| -
|
| -bool _isHtmlTemplate(Element el) => el.tagName == 'TEMPLATE' &&
|
| - el.namespaceUri == 'http://www.w3.org/1999/xhtml';
|
| -
|
| -/**
|
| - * Returns true if this node is semantically a template.
|
| - *
|
| - * A node is a template if [tagName] is TEMPLATE, or the node has the
|
| - * 'template' attribute and this tag supports attribute form for backwards
|
| - * compatibility with existing HTML parsers. The nodes that can use attribute
|
| - * form are table elements (THEAD, TBODY, TFOOT, TH, TR, TD, CAPTION, COLGROUP
|
| - * and COL), OPTION, and OPTGROUP.
|
| - */
|
| -bool isSemanticTemplate(Node n) => n is Element &&
|
| - (_isHtmlTemplate(n) || _isAttributeTemplate(n) || _isSvgTemplate(n));
|
| -
|
| -/** Returns true if this is the staging document for a template. */
|
| -bool isTemplateStagingDocument(Document d) => _isStagingDocument[d] == true;
|
| -
|
| -
|
| -/**
|
| - * True to enable [NodeBindingExtension.bindings]. This can be used by tools
|
| - * such as UI builders to easily inspect live bindings. Defaults to false for
|
| - * performance reasons.
|
| - */
|
| -bool get enableBindingsReflection =>
|
| - js.context['Platform']['enableBindingsReflection'] == true;
|
| -
|
| -set enableBindingsReflection(bool value) {
|
| - js.context['Platform']['enableBindingsReflection'] = value;
|
| -}
|
| -
|
| -// TODO(jmesserly): const set would be better
|
| -const _SEMANTIC_TEMPLATE_TAGS = const {
|
| - 'caption': null,
|
| - 'col': null,
|
| - 'colgroup': null,
|
| - 'option': null,
|
| - 'optgroup': null,
|
| - 'tbody': null,
|
| - 'td': null,
|
| - 'tfoot': null,
|
| - 'th': null,
|
| - 'thead': null,
|
| - 'tr': null,
|
| -};
|
| -
|
| -
|
| -// TODO(jmesserly): investigate if expandos give us enough performance.
|
| -
|
| -// The expando for storing our MDV extensions.
|
| -//
|
| -// In general, we need state associated with the nodes. Rather than having a
|
| -// bunch of individual expandos, we keep one per node.
|
| -//
|
| -// Aside from the potentially helping performance, it also keeps things simpler
|
| -// if we decide to integrate MDV into the DOM later, and means less code needs
|
| -// to worry about expandos.
|
| -final Expando _expando = new Expando('template_binding');
|
|
|