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