From 222dd701901ff0be5479f0baf3e629698b08cef3 Mon Sep 17 00:00:00 2001 From: Tilde Engineering Date: Sat, 28 Feb 2015 19:40:47 -0800 Subject: [PATCH] =?UTF-8?q?Improve=20=E2=80=9Creal=20app=E2=80=9D=20bootin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a series of improvements made to get Skylight booting on this branch: * Implement the new version of `makeBoundHelper` semantics and the param `apply`ing behavior of `Handlebars.makeBoundHelper`. The dependent key behavior of `makeBoundHelper` is not yet implemented. * Implement the HTMLBars helper hooks. * Make `each` support Ember Array-likes and falsy arrays. * Implement partials, including bound partial names * Support pass-through routes with no templates * Implement a very simple `link-to` stub * Implement a passable but not-very-good attribute bindings including fixing up view streams --- .../lib/compat/make-bound-helper.js | 101 ++---------------- packages/ember-htmlbars/lib/env.js | 10 +- packages/ember-htmlbars/lib/helpers/each.js | 16 +-- .../ember-htmlbars/lib/hooks/bind-self.js | 2 +- .../lib/hooks/create-shadow-scope.js | 1 + packages/ember-htmlbars/lib/hooks/get-root.js | 27 ++--- .../ember-htmlbars/lib/hooks/has-helper.js | 5 + .../ember-htmlbars/lib/hooks/lookup-helper.js | 5 + .../ember-htmlbars/lib/keywords/outlet.js | 8 ++ .../ember-htmlbars/lib/keywords/partial.js | 17 +++ .../lib/system/lookup-helper.js | 4 +- .../lib/system/make_bound_helper.js | 45 +------- .../ember-htmlbars/lib/templates/link-to.hbs | 1 + packages/ember-metal/lib/streams/stream.js | 7 ++ packages/ember-metal/lib/streams/utils.js | 12 +++ .../lib/helpers/link-to.js | 69 ++---------- .../lib/mixins/attribute_bindings_support.js | 2 +- .../lib/mixins/class_names_support.js | 23 ++-- .../lib/mixins/view_stream_support.js | 83 +------------- .../ember-views/lib/streams/key_stream.js | 7 -- .../ember-views/lib/system/lookup_partial.js | 21 +++- .../ember-views/lib/views/states/in_buffer.js | 4 +- packages/ember-views/lib/views/view.js | 4 +- 23 files changed, 136 insertions(+), 338 deletions(-) create mode 100644 packages/ember-htmlbars/lib/hooks/has-helper.js create mode 100644 packages/ember-htmlbars/lib/hooks/lookup-helper.js create mode 100644 packages/ember-htmlbars/lib/keywords/partial.js create mode 100644 packages/ember-htmlbars/lib/templates/link-to.hbs diff --git a/packages/ember-htmlbars/lib/compat/make-bound-helper.js b/packages/ember-htmlbars/lib/compat/make-bound-helper.js index 6d7ebc9eadb..a1ec272eed4 100644 --- a/packages/ember-htmlbars/lib/compat/make-bound-helper.js +++ b/packages/ember-htmlbars/lib/compat/make-bound-helper.js @@ -3,19 +3,8 @@ @submodule ember-htmlbars */ -import Ember from "ember-metal/core"; // Ember.FEATURES, Ember.assert, Ember.Handlebars, Ember.lookup -import { IS_BINDING } from "ember-metal/mixin"; import Helper from "ember-htmlbars/system/helper"; -import Stream from "ember-metal/streams/stream"; -import { - readArray, - scanArray, - scanHash, - readHash, - isStream -} from "ember-metal/streams/utils"; - /** A helper function used by `registerBoundHelper`. Takes the provided Handlebars helper function fn and returns it in wrapped @@ -42,88 +31,10 @@ import { @since 1.2.0 @deprecated */ -export default function makeBoundHelper(fn, compatMode) { - var dependentKeys = []; - for (var i = 1; i < arguments.length; i++) { - dependentKeys.push(arguments[i]); - } - - function helperFunc(params, hash, options, env) { - var view = this; - var numParams = params.length; - var param; - - Ember.assert("registerBoundHelper-generated helpers do not support use with Handlebars blocks.", !options.template); - - for (var prop in hash) { - if (IS_BINDING.test(prop)) { - hash[prop.slice(0, -7)] = view.getStream(hash[prop]); - delete hash[prop]; - } - } - - function valueFn() { - var args = readArray(params); - var properties = new Array(params.length); - for (var i = 0, l = params.length; i < l; i++) { - param = params[i]; - - if (isStream(param)) { - properties[i] = param._label; - } else { - properties[i] = param; - } - } - - args.push({ - hash: readHash(hash), - data: { properties: properties } - }); - return fn.apply(view, args); - } - - // If none of the hash parameters are bound, act as an unbound helper. - // This prevents views from being unnecessarily created - var hasStream = scanArray(params) || scanHash(hash); - if (hasStream) { - var lazyValue = new Stream(valueFn); - - for (i = 0; i < numParams; i++) { - param = params[i]; - if (isStream(param)) { - param.subscribe(lazyValue.notify, lazyValue); - } - } - - for (prop in hash) { - param = hash[prop]; - if (isStream(param)) { - param.subscribe(lazyValue.notify, lazyValue); - } - } - - if (numParams > 0) { - var firstParam = params[0]; - // Only bother with subscriptions if the first argument - // is a stream itself, and not a primitive. - if (isStream(firstParam)) { - var onDependentKeyNotify = function onDependentKeyNotify(stream) { - stream.value(); - lazyValue.notify(); - }; - for (i = 0; i < dependentKeys.length; i++) { - var childParam = firstParam.get(dependentKeys[i]); - childParam.value(); - childParam.subscribe(onDependentKeyNotify); - } - } - } - - return lazyValue; - } else { - return valueFn(); - } - } - - return new Helper(helperFunc); +export default function makeBoundHelper(fn) { + return new Helper(function(params, hash, templates) { + var args = params.slice(); + args.push({ hash: hash, templates: templates }); + fn.apply(undefined, args); + }); } diff --git a/packages/ember-htmlbars/lib/env.js b/packages/ember-htmlbars/lib/env.js index 26aa71fc455..b973cb0ac97 100644 --- a/packages/ember-htmlbars/lib/env.js +++ b/packages/ember-htmlbars/lib/env.js @@ -19,6 +19,8 @@ import getValue from "ember-htmlbars/hooks/get-value"; import cleanup from "ember-htmlbars/hooks/cleanup"; import classify from "ember-htmlbars/hooks/classify"; import component from "ember-htmlbars/hooks/component"; +import lookupHelper from "ember-htmlbars/hooks/lookup-helper"; +import hasHelper from "ember-htmlbars/hooks/has-helper"; import helpers from "ember-htmlbars/helpers"; @@ -38,7 +40,9 @@ merge(emberHooks, { concat: concat, cleanup: cleanup, classify: classify, - component: component + component: component, + lookupHelper: lookupHelper, + hasHelper: hasHelper }); import debuggerKeyword from "ember-htmlbars/keywords/debugger"; @@ -47,6 +51,7 @@ import outlet from "ember-htmlbars/keywords/outlet"; import unbound from "ember-htmlbars/keywords/unbound"; import view from "ember-htmlbars/keywords/view"; import componentKeyword from "ember-htmlbars/keywords/component"; +import partial from "ember-htmlbars/keywords/partial"; merge(emberHooks.keywords, { "debugger": debuggerKeyword, @@ -54,7 +59,8 @@ merge(emberHooks.keywords, { outlet: outlet, unbound: unbound, view: view, - component: componentKeyword + component: componentKeyword, + partial: partial }); export default { diff --git a/packages/ember-htmlbars/lib/helpers/each.js b/packages/ember-htmlbars/lib/helpers/each.js index f0e27385dd0..7099f243775 100644 --- a/packages/ember-htmlbars/lib/helpers/each.js +++ b/packages/ember-htmlbars/lib/helpers/each.js @@ -1,14 +1,18 @@ -import { guidFor } from "ember-metal/utils"; import { get } from "ember-metal/property_get"; +import { forEach } from "ember-metal/enumerable_utils"; export default function eachHelper(params, hash, blocks) { var list = params[0]; var keyPath = hash.key; - for (var i=0, l=list.length; i{{yield}} diff --git a/packages/ember-metal/lib/streams/stream.js b/packages/ember-metal/lib/streams/stream.js index 52c04b11bfe..d155bc64b90 100644 --- a/packages/ember-metal/lib/streams/stream.js +++ b/packages/ember-metal/lib/streams/stream.js @@ -107,6 +107,8 @@ function Stream(fn) { this.valueFn = fn; } +var KeyStream; + Stream.prototype = { isStream: true, @@ -125,6 +127,11 @@ Stream.prototype = { this.gotValueWhileInactive = false; }, + _makeChildStream: function(key) { + KeyStream = KeyStream || Ember.__loader.require('ember-views/streams/key_stream').default; + return new KeyStream(this, key); + }, + removeChild: function(key) { delete this.children[key]; }, diff --git a/packages/ember-metal/lib/streams/utils.js b/packages/ember-metal/lib/streams/utils.js index 0e3262dbc5f..7014aca4cd3 100644 --- a/packages/ember-metal/lib/streams/utils.js +++ b/packages/ember-metal/lib/streams/utils.js @@ -203,6 +203,18 @@ export function addDependency(stream, dependency) { } } +export function zip(streams, callback) { + var stream = new Stream(function() { + return callback(readArray(streams)); + }); + + for (var i=0, l=streams.length; i