ember-source 1.13.12 → 1.13.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/dist/ember-template-compiler.js +1153 -1153
- data/dist/ember-testing.js +1 -1
- data/dist/ember.debug.js +3007 -3023
- data/dist/ember.js +3007 -3023
- data/dist/ember.min.js +14 -14
- data/dist/ember.prod.js +2985 -3000
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa31a4982e2e253bbad2c88c35b219049f443dd9
|
4
|
+
data.tar.gz: d93b967c42599cdfd2ad5f76713e986e319c8004
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f3ca5c7b0b70bc78654c2298ec237f756bfe7d883d252bddf37ac562c7e314f6f62a6d22fcd6070396fda7904770e8df9a91bf552dc43e96cc14d2b60957ad8
|
7
|
+
data.tar.gz: 693f7574fed20beaea45b12b107a5ac8a35053b34a4518e9f7481d4f8177d9df48addec19b4b5b0df765716628dab6018406d05032ca8a03bd85df8414de361d
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.13.
|
1
|
+
1.13.13
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* Portions Copyright 2008-2011 Apple Inc. All rights reserved.
|
6
6
|
* @license Licensed under MIT license
|
7
7
|
* See https://raw.github.com/emberjs/ember.js/master/LICENSE
|
8
|
-
* @version 1.13.
|
8
|
+
* @version 1.13.13
|
9
9
|
*/
|
10
10
|
|
11
11
|
(function() {
|
@@ -1871,1410 +1871,1410 @@ enifed("ember-metal/chains", ["exports", "ember-metal/core", "ember-metal/proper
|
|
1871
1871
|
exports.ChainNode = ChainNode;
|
1872
1872
|
});
|
1873
1873
|
// warn, assert, etc;
|
1874
|
-
enifed("ember-metal/
|
1874
|
+
enifed("ember-metal/computed", ["exports", "ember-metal/core", "ember-metal/property_set", "ember-metal/utils", "ember-metal/expand_properties", "ember-metal/error", "ember-metal/properties", "ember-metal/property_events", "ember-metal/dependent_keys"], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
|
1875
1875
|
"use strict";
|
1876
1876
|
|
1877
|
-
exports.empty = empty;
|
1878
|
-
exports.notEmpty = notEmpty;
|
1879
|
-
exports.none = none;
|
1880
|
-
exports.not = not;
|
1881
|
-
exports.bool = bool;
|
1882
|
-
exports.match = match;
|
1883
|
-
exports.equal = equal;
|
1884
|
-
exports.gt = gt;
|
1885
|
-
exports.gte = gte;
|
1886
|
-
exports.lt = lt;
|
1887
|
-
exports.lte = lte;
|
1888
|
-
exports.oneWay = oneWay;
|
1889
|
-
exports.readOnly = readOnly;
|
1890
|
-
exports.defaultTo = defaultTo;
|
1891
|
-
exports.deprecatingAlias = deprecatingAlias;
|
1892
|
-
|
1893
1877
|
/**
|
1894
1878
|
@module ember
|
1895
1879
|
@submodule ember-metal
|
1896
1880
|
*/
|
1897
1881
|
|
1898
|
-
|
1899
|
-
var ret = {};
|
1900
|
-
for (var i = 0; i < propertyNames.length; i++) {
|
1901
|
-
ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
|
1902
|
-
}
|
1903
|
-
return ret;
|
1904
|
-
}
|
1905
|
-
|
1906
|
-
function generateComputedWithProperties(macro) {
|
1907
|
-
return function () {
|
1908
|
-
for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
|
1909
|
-
properties[_key] = arguments[_key];
|
1910
|
-
}
|
1882
|
+
var metaFor = _emberMetalUtils.meta;
|
1911
1883
|
|
1912
|
-
|
1913
|
-
return macro.apply(this, [getProperties(this, properties)]);
|
1914
|
-
});
|
1884
|
+
function UNDEFINED() {}
|
1915
1885
|
|
1916
|
-
|
1917
|
-
|
1918
|
-
|
1886
|
+
// ..........................................................
|
1887
|
+
// COMPUTED PROPERTY
|
1888
|
+
//
|
1919
1889
|
|
1920
1890
|
/**
|
1921
|
-
A computed property
|
1922
|
-
property is null, an empty string, empty array, or empty function.
|
1891
|
+
A computed property transforms an object's function into a property.
|
1923
1892
|
|
1924
|
-
|
1893
|
+
By default the function backing the computed property will only be called
|
1894
|
+
once and the result will be cached. You can specify various properties
|
1895
|
+
that your computed property depends on. This will force the cached
|
1896
|
+
result to be recomputed if the dependencies are modified.
|
1897
|
+
|
1898
|
+
In the following example we declare a computed property (by calling
|
1899
|
+
`.property()` on the fullName function) and setup the property
|
1900
|
+
dependencies (depending on firstName and lastName). The fullName function
|
1901
|
+
will be called once (regardless of how many times it is accessed) as long
|
1902
|
+
as its dependencies have not changed. Once firstName or lastName are updated
|
1903
|
+
any future calls (or anything bound) to fullName will incorporate the new
|
1904
|
+
values.
|
1925
1905
|
|
1926
1906
|
```javascript
|
1927
|
-
var
|
1928
|
-
|
1907
|
+
var Person = Ember.Object.extend({
|
1908
|
+
// these will be supplied by `create`
|
1909
|
+
firstName: null,
|
1910
|
+
lastName: null,
|
1911
|
+
|
1912
|
+
fullName: function() {
|
1913
|
+
var firstName = this.get('firstName');
|
1914
|
+
var lastName = this.get('lastName');
|
1915
|
+
|
1916
|
+
return firstName + ' ' + lastName;
|
1917
|
+
}.property('firstName', 'lastName')
|
1929
1918
|
});
|
1930
1919
|
|
1931
|
-
var
|
1932
|
-
|
1920
|
+
var tom = Person.create({
|
1921
|
+
firstName: 'Tom',
|
1922
|
+
lastName: 'Dale'
|
1933
1923
|
});
|
1934
1924
|
|
1935
|
-
|
1936
|
-
todoList.get('todos').clear();
|
1937
|
-
todoList.get('isDone'); // true
|
1925
|
+
tom.get('fullName') // 'Tom Dale'
|
1938
1926
|
```
|
1939
1927
|
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
@return {Ember.ComputedProperty} computed property which negate
|
1945
|
-
the original value for property
|
1946
|
-
@public
|
1947
|
-
*/
|
1948
|
-
|
1949
|
-
function empty(dependentKey) {
|
1950
|
-
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
1951
|
-
return _emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
1952
|
-
});
|
1953
|
-
}
|
1954
|
-
|
1955
|
-
/**
|
1956
|
-
A computed property that returns true if the value of the dependent
|
1957
|
-
property is NOT null, an empty string, empty array, or empty function.
|
1958
|
-
|
1959
|
-
Example
|
1928
|
+
You can also define what Ember should do when setting a computed property.
|
1929
|
+
If you try to set a computed property, it will be invoked with the key and
|
1930
|
+
value you want to set it to. You can also accept the previous value as the
|
1931
|
+
third parameter.
|
1960
1932
|
|
1961
1933
|
```javascript
|
1962
|
-
var
|
1963
|
-
|
1934
|
+
var Person = Ember.Object.extend({
|
1935
|
+
// these will be supplied by `create`
|
1936
|
+
firstName: null,
|
1937
|
+
lastName: null,
|
1938
|
+
|
1939
|
+
fullName: function(key, value, oldValue) {
|
1940
|
+
// getter
|
1941
|
+
if (arguments.length === 1) {
|
1942
|
+
var firstName = this.get('firstName');
|
1943
|
+
var lastName = this.get('lastName');
|
1944
|
+
|
1945
|
+
return firstName + ' ' + lastName;
|
1946
|
+
|
1947
|
+
// setter
|
1948
|
+
} else {
|
1949
|
+
var name = value.split(' ');
|
1950
|
+
|
1951
|
+
this.set('firstName', name[0]);
|
1952
|
+
this.set('lastName', name[1]);
|
1953
|
+
|
1954
|
+
return value;
|
1955
|
+
}
|
1956
|
+
}.property('firstName', 'lastName')
|
1964
1957
|
});
|
1965
1958
|
|
1966
|
-
var
|
1959
|
+
var person = Person.create();
|
1967
1960
|
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1961
|
+
person.set('fullName', 'Peter Wagenet');
|
1962
|
+
person.get('firstName'); // 'Peter'
|
1963
|
+
person.get('lastName'); // 'Wagenet'
|
1971
1964
|
```
|
1972
1965
|
|
1973
|
-
@
|
1974
|
-
@
|
1975
|
-
@
|
1976
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
1977
|
-
original value for property is not empty.
|
1966
|
+
@class ComputedProperty
|
1967
|
+
@namespace Ember
|
1968
|
+
@constructor
|
1978
1969
|
@public
|
1979
1970
|
*/
|
1971
|
+
function ComputedProperty(config, opts) {
|
1972
|
+
this.isDescriptor = true;
|
1973
|
+
if (typeof config === "function") {
|
1974
|
+
config.__ember_arity = config.length;
|
1975
|
+
this._getter = config;
|
1976
|
+
if (config.__ember_arity > 1) {
|
1977
|
+
_emberMetalCore["default"].deprecate("Using the same function as getter and setter is deprecated.", false, {
|
1978
|
+
url: "http://emberjs.com/deprecations/v1.x/#toc_deprecate-using-the-same-function-as-getter-and-setter-in-computed-properties"
|
1979
|
+
});
|
1980
|
+
this._setter = config;
|
1981
|
+
}
|
1982
|
+
} else {
|
1983
|
+
this._getter = config.get;
|
1984
|
+
this._setter = config.set;
|
1985
|
+
if (this._setter && this._setter.__ember_arity === undefined) {
|
1986
|
+
this._setter.__ember_arity = this._setter.length;
|
1987
|
+
}
|
1988
|
+
}
|
1980
1989
|
|
1981
|
-
|
1982
|
-
|
1983
|
-
|
1984
|
-
|
1990
|
+
this._dependentKeys = undefined;
|
1991
|
+
this._suspended = undefined;
|
1992
|
+
this._meta = undefined;
|
1993
|
+
|
1994
|
+
_emberMetalCore["default"].deprecate("Passing opts.cacheable to the CP constructor is deprecated. Invoke `volatile()` on the CP instead.", !opts || !opts.hasOwnProperty('cacheable'));
|
1995
|
+
this._cacheable = opts && opts.cacheable !== undefined ? opts.cacheable : true; // TODO: Set always to `true` once this deprecation is gone.
|
1996
|
+
this._dependentKeys = opts && opts.dependentKeys;
|
1997
|
+
_emberMetalCore["default"].deprecate("Passing opts.readOnly to the CP constructor is deprecated. All CPs are writable by default. You can invoke `readOnly()` on the CP to change this.", !opts || !opts.hasOwnProperty('readOnly'));
|
1998
|
+
this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
|
1985
1999
|
}
|
1986
2000
|
|
2001
|
+
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
2002
|
+
|
2003
|
+
var ComputedPropertyPrototype = ComputedProperty.prototype;
|
2004
|
+
|
1987
2005
|
/**
|
1988
|
-
|
1989
|
-
|
1990
|
-
about use of ==, which can be technically confusing.
|
2006
|
+
Properties are cacheable by default. Computed property will automatically
|
2007
|
+
cache the return value of your function until one of the dependent keys changes.
|
1991
2008
|
|
1992
|
-
|
2009
|
+
Call `volatile()` to set it into non-cached mode. When in this mode
|
2010
|
+
the computed property will not automatically cache the return value.
|
1993
2011
|
|
1994
|
-
|
1995
|
-
|
1996
|
-
isHungry: Ember.computed.none('food')
|
1997
|
-
});
|
2012
|
+
However, if a property is properly observable, there is no reason to disable
|
2013
|
+
caching.
|
1998
2014
|
|
1999
|
-
|
2015
|
+
@method cacheable
|
2016
|
+
@param {Boolean} aFlag optional set to `false` to disable caching
|
2017
|
+
@return {Ember.ComputedProperty} this
|
2018
|
+
@chainable
|
2019
|
+
@deprecated All computed properties are cacheble by default. Use `volatile()` instead to opt-out to caching.
|
2020
|
+
@public
|
2021
|
+
*/
|
2022
|
+
ComputedPropertyPrototype.cacheable = function (aFlag) {
|
2023
|
+
_emberMetalCore["default"].deprecate('ComputedProperty.cacheable() is deprecated. All computed properties are cacheable by default.');
|
2024
|
+
this._cacheable = aFlag !== false;
|
2025
|
+
return this;
|
2026
|
+
};
|
2027
|
+
|
2028
|
+
/**
|
2029
|
+
Call on a computed property to set it into non-cached mode. When in this
|
2030
|
+
mode the computed property will not automatically cache the return value.
|
2000
2031
|
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2004
|
-
|
2005
|
-
|
2032
|
+
```javascript
|
2033
|
+
var outsideService = Ember.Object.extend({
|
2034
|
+
value: function() {
|
2035
|
+
return OutsideService.getValue();
|
2036
|
+
}.property().volatile()
|
2037
|
+
}).create();
|
2006
2038
|
```
|
2007
2039
|
|
2008
|
-
@method
|
2009
|
-
@
|
2010
|
-
@
|
2011
|
-
@return {Ember.ComputedProperty} computed property which
|
2012
|
-
returns true if original value for property is null or undefined.
|
2040
|
+
@method volatile
|
2041
|
+
@return {Ember.ComputedProperty} this
|
2042
|
+
@chainable
|
2013
2043
|
@public
|
2014
2044
|
*/
|
2015
|
-
|
2016
|
-
|
2017
|
-
return
|
2018
|
-
|
2019
|
-
});
|
2020
|
-
}
|
2045
|
+
ComputedPropertyPrototype["volatile"] = function () {
|
2046
|
+
this._cacheable = false;
|
2047
|
+
return this;
|
2048
|
+
};
|
2021
2049
|
|
2022
2050
|
/**
|
2023
|
-
|
2024
|
-
|
2025
|
-
|
2026
|
-
Example
|
2051
|
+
Call on a computed property to set it into read-only mode. When in this
|
2052
|
+
mode the computed property will throw an error when set.
|
2027
2053
|
|
2028
2054
|
```javascript
|
2029
|
-
var
|
2030
|
-
|
2055
|
+
var Person = Ember.Object.extend({
|
2056
|
+
guid: function() {
|
2057
|
+
return 'guid-guid-guid';
|
2058
|
+
}.property().readOnly()
|
2031
2059
|
});
|
2032
2060
|
|
2033
|
-
var
|
2061
|
+
var person = Person.create();
|
2034
2062
|
|
2035
|
-
|
2036
|
-
user.set('loggedIn', true);
|
2037
|
-
user.get('isAnonymous'); // false
|
2063
|
+
person.set('guid', 'new-guid'); // will throw an exception
|
2038
2064
|
```
|
2039
2065
|
|
2040
|
-
@method
|
2041
|
-
@
|
2042
|
-
@
|
2043
|
-
@return {Ember.ComputedProperty} computed property which returns
|
2044
|
-
inverse of the original value for property
|
2066
|
+
@method readOnly
|
2067
|
+
@return {Ember.ComputedProperty} this
|
2068
|
+
@chainable
|
2045
2069
|
@public
|
2046
2070
|
*/
|
2047
|
-
|
2048
|
-
|
2049
|
-
|
2050
|
-
|
2051
|
-
|
2052
|
-
}
|
2071
|
+
ComputedPropertyPrototype.readOnly = function (readOnly) {
|
2072
|
+
_emberMetalCore["default"].deprecate('Passing arguments to ComputedProperty.readOnly() is deprecated.', arguments.length === 0);
|
2073
|
+
this._readOnly = readOnly === undefined || !!readOnly; // Force to true once this deprecation is gone
|
2074
|
+
_emberMetalCore["default"].assert("Computed properties that define a setter using the new syntax cannot be read-only", !(this._readOnly && this._setter && this._setter !== this._getter));
|
2075
|
+
return this;
|
2076
|
+
};
|
2053
2077
|
|
2054
2078
|
/**
|
2055
|
-
|
2056
|
-
|
2079
|
+
Sets the dependent keys on this computed property. Pass any number of
|
2080
|
+
arguments containing key paths that this computed property depends on.
|
2057
2081
|
|
2058
2082
|
```javascript
|
2059
|
-
var
|
2060
|
-
|
2083
|
+
var President = Ember.Object.extend({
|
2084
|
+
fullName: computed(function() {
|
2085
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2086
|
+
|
2087
|
+
// Tell Ember that this computed property depends on firstName
|
2088
|
+
// and lastName
|
2089
|
+
}).property('firstName', 'lastName')
|
2061
2090
|
});
|
2062
2091
|
|
2063
|
-
var
|
2092
|
+
var president = President.create({
|
2093
|
+
firstName: 'Barack',
|
2094
|
+
lastName: 'Obama'
|
2095
|
+
});
|
2064
2096
|
|
2065
|
-
|
2066
|
-
hamster.set('numBananas', 0);
|
2067
|
-
hamster.get('hasBananas'); // false
|
2068
|
-
hamster.set('numBananas', 1);
|
2069
|
-
hamster.get('hasBananas'); // true
|
2070
|
-
hamster.set('numBananas', null);
|
2071
|
-
hamster.get('hasBananas'); // false
|
2097
|
+
president.get('fullName'); // 'Barack Obama'
|
2072
2098
|
```
|
2073
2099
|
|
2074
|
-
@method
|
2075
|
-
@
|
2076
|
-
@
|
2077
|
-
@
|
2078
|
-
to boolean the original value for property
|
2100
|
+
@method property
|
2101
|
+
@param {String} path* zero or more property paths
|
2102
|
+
@return {Ember.ComputedProperty} this
|
2103
|
+
@chainable
|
2079
2104
|
@public
|
2080
2105
|
*/
|
2106
|
+
ComputedPropertyPrototype.property = function () {
|
2107
|
+
var args;
|
2081
2108
|
|
2082
|
-
|
2083
|
-
|
2084
|
-
|
2085
|
-
|
2086
|
-
|
2109
|
+
var addArg = function (property) {
|
2110
|
+
_emberMetalCore["default"].deprecate("Depending on arrays using a dependent key ending with `@each` is deprecated. " + ("Please refactor from `Ember.computed('" + property + "', function() {});` to `Ember.computed('" + property.slice(0, -6) + ".[]', function() {})`."), property.slice(-5) !== '@each', { id: 'ember-metal.@each-dependent-key-leaf', until: '2.0.0' });
|
2111
|
+
|
2112
|
+
args.push(property);
|
2113
|
+
};
|
2114
|
+
|
2115
|
+
args = [];
|
2116
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
2117
|
+
_emberMetalExpand_properties["default"](arguments[i], addArg);
|
2118
|
+
}
|
2119
|
+
|
2120
|
+
this._dependentKeys = args;
|
2121
|
+
return this;
|
2122
|
+
};
|
2087
2123
|
|
2088
2124
|
/**
|
2089
|
-
|
2090
|
-
|
2091
|
-
|
2092
|
-
|
2093
|
-
Example
|
2094
|
-
|
2095
|
-
```javascript
|
2096
|
-
var User = Ember.Object.extend({
|
2097
|
-
hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
|
2098
|
-
});
|
2125
|
+
In some cases, you may want to annotate computed properties with additional
|
2126
|
+
metadata about how they function or what values they operate on. For example,
|
2127
|
+
computed property functions may close over variables that are then no longer
|
2128
|
+
available for introspection.
|
2099
2129
|
|
2100
|
-
|
2130
|
+
You can pass a hash of these values to a computed property like this:
|
2101
2131
|
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
|
2106
|
-
|
2132
|
+
```
|
2133
|
+
person: function() {
|
2134
|
+
var personId = this.get('personId');
|
2135
|
+
return App.Person.create({ id: personId });
|
2136
|
+
}.property().meta({ type: App.Person })
|
2107
2137
|
```
|
2108
2138
|
|
2109
|
-
|
2110
|
-
|
2111
|
-
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2139
|
+
The hash that you pass to the `meta()` function will be saved on the
|
2140
|
+
computed property descriptor under the `_meta` key. Ember runtime
|
2141
|
+
exposes a public API for retrieving these values from classes,
|
2142
|
+
via the `metaForProperty()` function.
|
2143
|
+
|
2144
|
+
@method meta
|
2145
|
+
@param {Object} meta
|
2146
|
+
@chainable
|
2115
2147
|
@public
|
2116
2148
|
*/
|
2117
2149
|
|
2118
|
-
function
|
2119
|
-
|
2120
|
-
|
2150
|
+
ComputedPropertyPrototype.meta = function (meta) {
|
2151
|
+
if (arguments.length === 0) {
|
2152
|
+
return this._meta || {};
|
2153
|
+
} else {
|
2154
|
+
this._meta = meta;
|
2155
|
+
return this;
|
2156
|
+
}
|
2157
|
+
};
|
2121
2158
|
|
2122
|
-
|
2123
|
-
|
2159
|
+
/* impl descriptor API */
|
2160
|
+
ComputedPropertyPrototype.didChange = function (obj, keyName) {
|
2161
|
+
// _suspended is set via a CP.set to ensure we don't clear
|
2162
|
+
// the cached value set by the setter
|
2163
|
+
if (this._cacheable && this._suspended !== obj) {
|
2164
|
+
var meta = metaFor(obj);
|
2165
|
+
if (meta.cache && meta.cache[keyName] !== undefined) {
|
2166
|
+
meta.cache[keyName] = undefined;
|
2167
|
+
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
2168
|
+
}
|
2169
|
+
}
|
2170
|
+
};
|
2171
|
+
|
2172
|
+
function finishChains(chainNodes) {
|
2173
|
+
for (var i = 0, l = chainNodes.length; i < l; i++) {
|
2174
|
+
chainNodes[i].didChange(null);
|
2175
|
+
}
|
2124
2176
|
}
|
2125
2177
|
|
2126
2178
|
/**
|
2127
|
-
|
2128
|
-
|
2129
|
-
|
2130
|
-
Example
|
2179
|
+
Access the value of the function backing the computed property.
|
2180
|
+
If this property has already been cached, return the cached result.
|
2181
|
+
Otherwise, call the function passing the property name as an argument.
|
2131
2182
|
|
2132
2183
|
```javascript
|
2133
|
-
var
|
2134
|
-
|
2184
|
+
var Person = Ember.Object.extend({
|
2185
|
+
fullName: function(keyName) {
|
2186
|
+
// the keyName parameter is 'fullName' in this case.
|
2187
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2188
|
+
}.property('firstName', 'lastName')
|
2135
2189
|
});
|
2136
2190
|
|
2137
|
-
var hamster = Hamster.create();
|
2138
2191
|
|
2139
|
-
|
2140
|
-
|
2141
|
-
|
2142
|
-
|
2143
|
-
|
2192
|
+
var tom = Person.create({
|
2193
|
+
firstName: 'Tom',
|
2194
|
+
lastName: 'Dale'
|
2195
|
+
});
|
2196
|
+
|
2197
|
+
tom.get('fullName') // 'Tom Dale'
|
2144
2198
|
```
|
2145
2199
|
|
2146
|
-
@method
|
2147
|
-
@
|
2148
|
-
@
|
2149
|
-
@param {String|Number|Object} value
|
2150
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
2151
|
-
the original value for property is equal to the given value.
|
2200
|
+
@method get
|
2201
|
+
@param {String} keyName The key being accessed.
|
2202
|
+
@return {Object} The return value of the function backing the CP.
|
2152
2203
|
@public
|
2153
2204
|
*/
|
2205
|
+
ComputedPropertyPrototype.get = function (obj, keyName) {
|
2206
|
+
var ret, cache, meta, chainNodes;
|
2207
|
+
if (this._cacheable) {
|
2208
|
+
meta = metaFor(obj);
|
2209
|
+
cache = meta.cache;
|
2154
2210
|
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2159
|
-
|
2211
|
+
var result = cache && cache[keyName];
|
2212
|
+
|
2213
|
+
if (result === UNDEFINED) {
|
2214
|
+
return undefined;
|
2215
|
+
} else if (result !== undefined) {
|
2216
|
+
return result;
|
2217
|
+
}
|
2218
|
+
|
2219
|
+
ret = this._getter.call(obj, keyName);
|
2220
|
+
cache = meta.cache;
|
2221
|
+
if (!cache) {
|
2222
|
+
cache = meta.cache = {};
|
2223
|
+
}
|
2224
|
+
if (ret === undefined) {
|
2225
|
+
cache[keyName] = UNDEFINED;
|
2226
|
+
} else {
|
2227
|
+
cache[keyName] = ret;
|
2228
|
+
}
|
2229
|
+
|
2230
|
+
chainNodes = meta.chainWatchers && meta.chainWatchers[keyName];
|
2231
|
+
if (chainNodes) {
|
2232
|
+
finishChains(chainNodes);
|
2233
|
+
}
|
2234
|
+
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
2235
|
+
} else {
|
2236
|
+
ret = this._getter.call(obj, keyName);
|
2237
|
+
}
|
2238
|
+
return ret;
|
2239
|
+
};
|
2160
2240
|
|
2161
2241
|
/**
|
2162
|
-
|
2163
|
-
|
2242
|
+
Set the value of a computed property. If the function that backs your
|
2243
|
+
computed property does not accept arguments then the default action for
|
2244
|
+
setting would be to define the property on the current object, and set
|
2245
|
+
the value of the property to the value being set.
|
2164
2246
|
|
2165
|
-
|
2247
|
+
Generally speaking if you intend for your computed property to be set
|
2248
|
+
your backing function should accept either two or three arguments.
|
2166
2249
|
|
2167
2250
|
```javascript
|
2168
|
-
var
|
2169
|
-
|
2170
|
-
|
2251
|
+
var Person = Ember.Object.extend({
|
2252
|
+
// these will be supplied by `create`
|
2253
|
+
firstName: null,
|
2254
|
+
lastName: null,
|
2171
2255
|
|
2172
|
-
|
2256
|
+
fullName: function(key, value, oldValue) {
|
2257
|
+
// getter
|
2258
|
+
if (arguments.length === 1) {
|
2259
|
+
var firstName = this.get('firstName');
|
2260
|
+
var lastName = this.get('lastName');
|
2173
2261
|
|
2174
|
-
|
2175
|
-
hamster.set('numBananas', 3);
|
2176
|
-
hamster.get('hasTooManyBananas'); // false
|
2177
|
-
hamster.set('numBananas', 11);
|
2178
|
-
hamster.get('hasTooManyBananas'); // true
|
2179
|
-
```
|
2262
|
+
return firstName + ' ' + lastName;
|
2180
2263
|
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
@param {Number} value
|
2185
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
2186
|
-
the original value for property is greater than given value.
|
2187
|
-
@public
|
2188
|
-
*/
|
2189
|
-
|
2190
|
-
function gt(dependentKey, value) {
|
2191
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
2192
|
-
return _emberMetalProperty_get.get(this, dependentKey) > value;
|
2193
|
-
});
|
2194
|
-
}
|
2195
|
-
|
2196
|
-
/**
|
2197
|
-
A computed property that returns true if the provided dependent property
|
2198
|
-
is greater than or equal to the provided value.
|
2264
|
+
// setter
|
2265
|
+
} else {
|
2266
|
+
var name = value.split(' ');
|
2199
2267
|
|
2200
|
-
|
2268
|
+
this.set('firstName', name[0]);
|
2269
|
+
this.set('lastName', name[1]);
|
2201
2270
|
|
2202
|
-
|
2203
|
-
|
2204
|
-
|
2271
|
+
return value;
|
2272
|
+
}
|
2273
|
+
}.property('firstName', 'lastName')
|
2205
2274
|
});
|
2206
2275
|
|
2207
|
-
var
|
2276
|
+
var person = Person.create();
|
2208
2277
|
|
2209
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
hamster.set('numBananas', 10);
|
2213
|
-
hamster.get('hasTooManyBananas'); // true
|
2278
|
+
person.set('fullName', 'Peter Wagenet');
|
2279
|
+
person.get('firstName'); // 'Peter'
|
2280
|
+
person.get('lastName'); // 'Wagenet'
|
2214
2281
|
```
|
2215
2282
|
|
2216
|
-
@method
|
2217
|
-
@
|
2218
|
-
@param {
|
2219
|
-
@param {
|
2220
|
-
@return {
|
2221
|
-
the original value for property is greater or equal then given value.
|
2283
|
+
@method set
|
2284
|
+
@param {String} keyName The key being accessed.
|
2285
|
+
@param {Object} newValue The new value being assigned.
|
2286
|
+
@param {String} oldValue The old value being replaced.
|
2287
|
+
@return {Object} The return value of the function backing the CP.
|
2222
2288
|
@public
|
2223
2289
|
*/
|
2290
|
+
ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
|
2291
|
+
var oldSuspended = this._suspended;
|
2224
2292
|
|
2225
|
-
|
2226
|
-
|
2227
|
-
|
2228
|
-
|
2229
|
-
|
2293
|
+
this._suspended = obj;
|
2294
|
+
|
2295
|
+
try {
|
2296
|
+
this._set(obj, keyName, value);
|
2297
|
+
} finally {
|
2298
|
+
this._suspended = oldSuspended;
|
2299
|
+
}
|
2300
|
+
};
|
2301
|
+
|
2302
|
+
ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
|
2303
|
+
var cacheable = this._cacheable;
|
2304
|
+
var setter = this._setter;
|
2305
|
+
var meta = metaFor(obj, cacheable);
|
2306
|
+
var cache = meta.cache;
|
2307
|
+
var hadCachedValue = false;
|
2308
|
+
|
2309
|
+
var cachedValue, ret;
|
2310
|
+
|
2311
|
+
if (this._readOnly) {
|
2312
|
+
throw new _emberMetalError["default"]("Cannot set read-only property \"" + keyName + "\" on object: " + _emberMetalUtils.inspect(obj));
|
2313
|
+
}
|
2314
|
+
|
2315
|
+
if (cacheable && cache && cache[keyName] !== undefined) {
|
2316
|
+
if (cache[keyName] !== UNDEFINED) {
|
2317
|
+
cachedValue = cache[keyName];
|
2318
|
+
}
|
2319
|
+
|
2320
|
+
hadCachedValue = true;
|
2321
|
+
}
|
2322
|
+
|
2323
|
+
if (!setter) {
|
2324
|
+
_emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
|
2325
|
+
_emberMetalProperty_set.set(obj, keyName, value);
|
2326
|
+
return;
|
2327
|
+
} else if (setter.__ember_arity === 2) {
|
2328
|
+
// Is there any way of deprecate this in a sensitive way?
|
2329
|
+
// Maybe now that getters and setters are the prefered options we can....
|
2330
|
+
ret = setter.call(obj, keyName, value);
|
2331
|
+
} else {
|
2332
|
+
ret = setter.call(obj, keyName, value, cachedValue);
|
2333
|
+
}
|
2334
|
+
|
2335
|
+
if (hadCachedValue && cachedValue === ret) {
|
2336
|
+
return;
|
2337
|
+
}
|
2338
|
+
|
2339
|
+
var watched = meta.watching[keyName];
|
2340
|
+
if (watched) {
|
2341
|
+
_emberMetalProperty_events.propertyWillChange(obj, keyName);
|
2342
|
+
}
|
2343
|
+
|
2344
|
+
if (hadCachedValue) {
|
2345
|
+
cache[keyName] = undefined;
|
2346
|
+
}
|
2347
|
+
|
2348
|
+
if (cacheable) {
|
2349
|
+
if (!hadCachedValue) {
|
2350
|
+
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
2351
|
+
}
|
2352
|
+
if (!cache) {
|
2353
|
+
cache = meta.cache = {};
|
2354
|
+
}
|
2355
|
+
if (ret === undefined) {
|
2356
|
+
cache[keyName] = UNDEFINED;
|
2357
|
+
} else {
|
2358
|
+
cache[keyName] = ret;
|
2359
|
+
}
|
2360
|
+
}
|
2361
|
+
|
2362
|
+
if (watched) {
|
2363
|
+
_emberMetalProperty_events.propertyDidChange(obj, keyName);
|
2364
|
+
}
|
2365
|
+
|
2366
|
+
return ret;
|
2367
|
+
};
|
2368
|
+
|
2369
|
+
/* called before property is overridden */
|
2370
|
+
ComputedPropertyPrototype.teardown = function (obj, keyName) {
|
2371
|
+
var meta = metaFor(obj);
|
2372
|
+
|
2373
|
+
if (meta.cache) {
|
2374
|
+
if (keyName in meta.cache) {
|
2375
|
+
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
2376
|
+
}
|
2377
|
+
|
2378
|
+
if (this._cacheable) {
|
2379
|
+
delete meta.cache[keyName];
|
2380
|
+
}
|
2381
|
+
}
|
2382
|
+
|
2383
|
+
return null; // no value to restore
|
2384
|
+
};
|
2230
2385
|
|
2231
2386
|
/**
|
2232
|
-
|
2233
|
-
|
2234
|
-
|
2235
|
-
Example
|
2387
|
+
This helper returns a new property descriptor that wraps the passed
|
2388
|
+
computed property function. You can use this helper to define properties
|
2389
|
+
with mixins or via `Ember.defineProperty()`.
|
2236
2390
|
|
2237
|
-
|
2238
|
-
|
2239
|
-
|
2240
|
-
|
2391
|
+
The function you pass will be used to both get and set property values.
|
2392
|
+
The function should accept two parameters, key and value. If value is not
|
2393
|
+
undefined you should set the value first. In either case return the
|
2394
|
+
current value of the property.
|
2241
2395
|
|
2242
|
-
|
2396
|
+
A computed property defined in this way might look like this:
|
2243
2397
|
|
2244
|
-
|
2245
|
-
|
2246
|
-
|
2247
|
-
|
2248
|
-
hamster.get('needsMoreBananas'); // true
|
2249
|
-
```
|
2398
|
+
```js
|
2399
|
+
var Person = Ember.Object.extend({
|
2400
|
+
firstName: 'Betty',
|
2401
|
+
lastName: 'Jones',
|
2250
2402
|
|
2251
|
-
|
2252
|
-
|
2253
|
-
|
2254
|
-
@param {Number} value
|
2255
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
2256
|
-
the original value for property is less then given value.
|
2257
|
-
@public
|
2258
|
-
*/
|
2259
|
-
|
2260
|
-
function lt(dependentKey, value) {
|
2261
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
2262
|
-
return _emberMetalProperty_get.get(this, dependentKey) < value;
|
2403
|
+
fullName: Ember.computed('firstName', 'lastName', function(key, value) {
|
2404
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2405
|
+
})
|
2263
2406
|
});
|
2264
|
-
}
|
2265
|
-
|
2266
|
-
/**
|
2267
|
-
A computed property that returns true if the provided dependent property
|
2268
|
-
is less than or equal to the provided value.
|
2269
2407
|
|
2270
|
-
|
2408
|
+
var client = Person.create();
|
2271
2409
|
|
2272
|
-
|
2273
|
-
var Hamster = Ember.Object.extend({
|
2274
|
-
needsMoreBananas: Ember.computed.lte('numBananas', 3)
|
2275
|
-
});
|
2410
|
+
client.get('fullName'); // 'Betty Jones'
|
2276
2411
|
|
2277
|
-
|
2412
|
+
client.set('lastName', 'Fuller');
|
2413
|
+
client.get('fullName'); // 'Betty Fuller'
|
2414
|
+
```
|
2278
2415
|
|
2279
|
-
|
2280
|
-
|
2281
|
-
|
2282
|
-
|
2283
|
-
|
2416
|
+
_Note: This is the preferred way to define computed properties when writing third-party
|
2417
|
+
libraries that depend on or use Ember, since there is no guarantee that the user
|
2418
|
+
will have prototype extensions enabled._
|
2419
|
+
|
2420
|
+
You might use this method if you disabled
|
2421
|
+
[Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
|
2422
|
+
The alternative syntax might look like this
|
2423
|
+
(if prototype extensions are enabled, which is the default behavior):
|
2424
|
+
|
2425
|
+
```js
|
2426
|
+
fullName: function () {
|
2427
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2428
|
+
}.property('firstName', 'lastName')
|
2284
2429
|
```
|
2285
2430
|
|
2286
|
-
@
|
2287
|
-
@
|
2288
|
-
@
|
2289
|
-
@
|
2290
|
-
@
|
2291
|
-
|
2431
|
+
@class computed
|
2432
|
+
@namespace Ember
|
2433
|
+
@constructor
|
2434
|
+
@static
|
2435
|
+
@param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
|
2436
|
+
@param {Function} func The computed property function.
|
2437
|
+
@return {Ember.ComputedProperty} property descriptor instance
|
2292
2438
|
@public
|
2293
2439
|
*/
|
2440
|
+
function computed(func) {
|
2441
|
+
var args;
|
2294
2442
|
|
2295
|
-
|
2296
|
-
|
2297
|
-
|
2298
|
-
}
|
2443
|
+
if (arguments.length > 1) {
|
2444
|
+
args = [].slice.call(arguments);
|
2445
|
+
func = args.pop();
|
2446
|
+
}
|
2447
|
+
|
2448
|
+
var cp = new ComputedProperty(func);
|
2449
|
+
|
2450
|
+
if (args) {
|
2451
|
+
cp.property.apply(cp, args);
|
2452
|
+
}
|
2453
|
+
|
2454
|
+
return cp;
|
2299
2455
|
}
|
2300
2456
|
|
2301
2457
|
/**
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2306
|
-
|
2307
|
-
```javascript
|
2308
|
-
var Hamster = Ember.Object.extend({
|
2309
|
-
readyForCamp: Ember.computed.and('hasTent', 'hasBackpack')
|
2310
|
-
});
|
2311
|
-
|
2312
|
-
var hamster = Hamster.create();
|
2313
|
-
|
2314
|
-
hamster.get('readyForCamp'); // false
|
2315
|
-
hamster.set('hasTent', true);
|
2316
|
-
hamster.get('readyForCamp'); // false
|
2317
|
-
hamster.set('hasBackpack', true);
|
2318
|
-
hamster.get('readyForCamp'); // true
|
2319
|
-
hamster.set('hasBackpack', 'Yes');
|
2320
|
-
hamster.get('readyForCamp'); // 'Yes'
|
2321
|
-
```
|
2458
|
+
Returns the cached value for a property, if one exists.
|
2459
|
+
This can be useful for peeking at the value of a computed
|
2460
|
+
property that is generated lazily, without accidentally causing
|
2461
|
+
it to be created.
|
2322
2462
|
|
2323
|
-
@method
|
2324
|
-
@for Ember
|
2325
|
-
@param {
|
2326
|
-
@
|
2327
|
-
|
2463
|
+
@method cacheFor
|
2464
|
+
@for Ember
|
2465
|
+
@param {Object} obj the object whose property you want to check
|
2466
|
+
@param {String} key the name of the property whose cached value you want
|
2467
|
+
to return
|
2468
|
+
@return {Object} the cached value
|
2328
2469
|
@public
|
2329
2470
|
*/
|
2330
|
-
|
2331
|
-
var
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2335
|
-
|
2336
|
-
|
2471
|
+
function cacheFor(obj, key) {
|
2472
|
+
var meta = obj['__ember_meta__'];
|
2473
|
+
var cache = meta && meta.cache;
|
2474
|
+
var ret = cache && cache[key];
|
2475
|
+
|
2476
|
+
if (ret === UNDEFINED) {
|
2477
|
+
return undefined;
|
2337
2478
|
}
|
2338
|
-
return
|
2339
|
-
}
|
2479
|
+
return ret;
|
2480
|
+
}
|
2481
|
+
|
2482
|
+
cacheFor.set = function (cache, key, value) {
|
2483
|
+
if (value === undefined) {
|
2484
|
+
cache[key] = UNDEFINED;
|
2485
|
+
} else {
|
2486
|
+
cache[key] = value;
|
2487
|
+
}
|
2488
|
+
};
|
2489
|
+
|
2490
|
+
cacheFor.get = function (cache, key) {
|
2491
|
+
var ret = cache[key];
|
2492
|
+
if (ret === UNDEFINED) {
|
2493
|
+
return undefined;
|
2494
|
+
}
|
2495
|
+
return ret;
|
2496
|
+
};
|
2497
|
+
|
2498
|
+
cacheFor.remove = function (cache, key) {
|
2499
|
+
cache[key] = undefined;
|
2500
|
+
};
|
2501
|
+
|
2502
|
+
exports.ComputedProperty = ComputedProperty;
|
2503
|
+
exports.computed = computed;
|
2504
|
+
exports.cacheFor = cacheFor;
|
2505
|
+
});
|
2506
|
+
enifed("ember-metal/computed_macros", ["exports", "ember-metal/core", "ember-metal/property_get", "ember-metal/property_set", "ember-metal/computed", "ember-metal/is_empty", "ember-metal/is_none", "ember-metal/alias"], function (exports, _emberMetalCore, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalComputed, _emberMetalIs_empty, _emberMetalIs_none, _emberMetalAlias) {
|
2507
|
+
"use strict";
|
2508
|
+
|
2509
|
+
exports.empty = empty;
|
2510
|
+
exports.notEmpty = notEmpty;
|
2511
|
+
exports.none = none;
|
2512
|
+
exports.not = not;
|
2513
|
+
exports.bool = bool;
|
2514
|
+
exports.match = match;
|
2515
|
+
exports.equal = equal;
|
2516
|
+
exports.gt = gt;
|
2517
|
+
exports.gte = gte;
|
2518
|
+
exports.lt = lt;
|
2519
|
+
exports.lte = lte;
|
2520
|
+
exports.oneWay = oneWay;
|
2521
|
+
exports.readOnly = readOnly;
|
2522
|
+
exports.defaultTo = defaultTo;
|
2523
|
+
exports.deprecatingAlias = deprecatingAlias;
|
2340
2524
|
|
2341
|
-
exports.and = and;
|
2342
2525
|
/**
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2346
|
-
Example
|
2347
|
-
|
2348
|
-
```javascript
|
2349
|
-
var Hamster = Ember.Object.extend({
|
2350
|
-
readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
|
2351
|
-
});
|
2352
|
-
|
2353
|
-
var hamster = Hamster.create();
|
2354
|
-
|
2355
|
-
hamster.get('readyForRain'); // false
|
2356
|
-
hamster.set('hasUmbrella', true);
|
2357
|
-
hamster.get('readyForRain'); // true
|
2358
|
-
hamster.set('hasJacket', 'Yes');
|
2359
|
-
hamster.get('readyForRain'); // 'Yes'
|
2360
|
-
```
|
2361
|
-
|
2362
|
-
@method or
|
2363
|
-
@for Ember.computed
|
2364
|
-
@param {String} dependentKey*
|
2365
|
-
@return {Ember.ComputedProperty} computed property which performs
|
2366
|
-
a logical `or` on the values of all the original values for properties.
|
2367
|
-
@public
|
2526
|
+
@module ember
|
2527
|
+
@submodule ember-metal
|
2368
2528
|
*/
|
2369
|
-
|
2370
|
-
|
2371
|
-
|
2372
|
-
|
2373
|
-
|
2529
|
+
|
2530
|
+
function getProperties(self, propertyNames) {
|
2531
|
+
var ret = {};
|
2532
|
+
for (var i = 0; i < propertyNames.length; i++) {
|
2533
|
+
ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
|
2374
2534
|
}
|
2375
|
-
return
|
2376
|
-
}
|
2535
|
+
return ret;
|
2536
|
+
}
|
2537
|
+
|
2538
|
+
function generateComputedWithProperties(macro) {
|
2539
|
+
return function () {
|
2540
|
+
for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
|
2541
|
+
properties[_key] = arguments[_key];
|
2542
|
+
}
|
2543
|
+
|
2544
|
+
var computedFunc = _emberMetalComputed.computed(function () {
|
2545
|
+
return macro.apply(this, [getProperties(this, properties)]);
|
2546
|
+
});
|
2547
|
+
|
2548
|
+
return computedFunc.property.apply(computedFunc, properties);
|
2549
|
+
};
|
2550
|
+
}
|
2377
2551
|
|
2378
|
-
exports.or = or;
|
2379
2552
|
/**
|
2380
|
-
A computed property that returns the
|
2381
|
-
|
2553
|
+
A computed property that returns true if the value of the dependent
|
2554
|
+
property is null, an empty string, empty array, or empty function.
|
2382
2555
|
|
2383
2556
|
Example
|
2384
2557
|
|
2385
2558
|
```javascript
|
2386
|
-
var
|
2387
|
-
|
2559
|
+
var ToDoList = Ember.Object.extend({
|
2560
|
+
isDone: Ember.computed.empty('todos')
|
2388
2561
|
});
|
2389
2562
|
|
2390
|
-
var
|
2563
|
+
var todoList = ToDoList.create({
|
2564
|
+
todos: ['Unit Test', 'Documentation', 'Release']
|
2565
|
+
});
|
2391
2566
|
|
2392
|
-
|
2393
|
-
|
2394
|
-
|
2567
|
+
todoList.get('isDone'); // false
|
2568
|
+
todoList.get('todos').clear();
|
2569
|
+
todoList.get('isDone'); // true
|
2395
2570
|
```
|
2396
2571
|
|
2397
|
-
@
|
2572
|
+
@since 1.6.0
|
2573
|
+
@method empty
|
2398
2574
|
@for Ember.computed
|
2399
|
-
@param {String} dependentKey
|
2400
|
-
@return {Ember.ComputedProperty} computed property which
|
2401
|
-
the
|
2402
|
-
@deprecated Use `Ember.computed.or` instead.
|
2575
|
+
@param {String} dependentKey
|
2576
|
+
@return {Ember.ComputedProperty} computed property which negate
|
2577
|
+
the original value for property
|
2403
2578
|
@public
|
2404
2579
|
*/
|
2405
|
-
var any = generateComputedWithProperties(function (properties) {
|
2406
|
-
_emberMetalCore["default"].deprecate('Usage of Ember.computed.any is deprecated, use `Ember.computed.or` instead.');
|
2407
|
-
for (var key in properties) {
|
2408
|
-
if (properties.hasOwnProperty(key) && properties[key]) {
|
2409
|
-
return properties[key];
|
2410
|
-
}
|
2411
|
-
}
|
2412
|
-
return null;
|
2413
|
-
});
|
2414
2580
|
|
2415
|
-
|
2581
|
+
function empty(dependentKey) {
|
2582
|
+
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
2583
|
+
return _emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2584
|
+
});
|
2585
|
+
}
|
2586
|
+
|
2416
2587
|
/**
|
2417
|
-
A computed property that returns the
|
2418
|
-
|
2588
|
+
A computed property that returns true if the value of the dependent
|
2589
|
+
property is NOT null, an empty string, empty array, or empty function.
|
2419
2590
|
|
2420
2591
|
Example
|
2421
2592
|
|
2422
2593
|
```javascript
|
2423
2594
|
var Hamster = Ember.Object.extend({
|
2424
|
-
|
2595
|
+
hasStuff: Ember.computed.notEmpty('backpack')
|
2425
2596
|
});
|
2426
2597
|
|
2427
|
-
var hamster = Hamster.create();
|
2598
|
+
var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
|
2428
2599
|
|
2429
|
-
hamster.get('
|
2430
|
-
hamster.
|
2431
|
-
hamster.
|
2432
|
-
hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
|
2600
|
+
hamster.get('hasStuff'); // true
|
2601
|
+
hamster.get('backpack').clear(); // []
|
2602
|
+
hamster.get('hasStuff'); // false
|
2433
2603
|
```
|
2434
2604
|
|
2435
|
-
@method
|
2605
|
+
@method notEmpty
|
2436
2606
|
@for Ember.computed
|
2437
|
-
@param {String} dependentKey
|
2438
|
-
@return {Ember.ComputedProperty} computed property which
|
2439
|
-
|
2607
|
+
@param {String} dependentKey
|
2608
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2609
|
+
original value for property is not empty.
|
2440
2610
|
@public
|
2441
2611
|
*/
|
2442
|
-
var collect = generateComputedWithProperties(function (properties) {
|
2443
|
-
var res = _emberMetalCore["default"].A();
|
2444
|
-
for (var key in properties) {
|
2445
|
-
if (properties.hasOwnProperty(key)) {
|
2446
|
-
if (_emberMetalIs_none["default"](properties[key])) {
|
2447
|
-
res.push(null);
|
2448
|
-
} else {
|
2449
|
-
res.push(properties[key]);
|
2450
|
-
}
|
2451
|
-
}
|
2452
|
-
}
|
2453
|
-
return res;
|
2454
|
-
});
|
2455
2612
|
|
2456
|
-
|
2613
|
+
function notEmpty(dependentKey) {
|
2614
|
+
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
2615
|
+
return !_emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2616
|
+
});
|
2617
|
+
}
|
2618
|
+
|
2457
2619
|
/**
|
2458
|
-
|
2459
|
-
|
2460
|
-
|
2620
|
+
A computed property that returns true if the value of the dependent
|
2621
|
+
property is null or undefined. This avoids errors from JSLint complaining
|
2622
|
+
about use of ==, which can be technically confusing.
|
2623
|
+
|
2624
|
+
Example
|
2461
2625
|
|
2462
2626
|
```javascript
|
2463
|
-
var
|
2464
|
-
|
2465
|
-
nomen: Ember.computed.alias('name')
|
2627
|
+
var Hamster = Ember.Object.extend({
|
2628
|
+
isHungry: Ember.computed.none('food')
|
2466
2629
|
});
|
2467
2630
|
|
2468
|
-
var
|
2469
|
-
|
2470
|
-
alex.get('nomen'); // 'Alex Matchneer'
|
2471
|
-
alex.get('name'); // 'Alex Matchneer'
|
2631
|
+
var hamster = Hamster.create();
|
2472
2632
|
|
2473
|
-
|
2474
|
-
|
2633
|
+
hamster.get('isHungry'); // true
|
2634
|
+
hamster.set('food', 'Banana');
|
2635
|
+
hamster.get('isHungry'); // false
|
2636
|
+
hamster.set('food', null);
|
2637
|
+
hamster.get('isHungry'); // true
|
2475
2638
|
```
|
2476
2639
|
|
2477
|
-
@method
|
2640
|
+
@method none
|
2478
2641
|
@for Ember.computed
|
2479
2642
|
@param {String} dependentKey
|
2480
|
-
@return {Ember.ComputedProperty} computed property which
|
2481
|
-
|
2643
|
+
@return {Ember.ComputedProperty} computed property which
|
2644
|
+
returns true if original value for property is null or undefined.
|
2482
2645
|
@public
|
2483
2646
|
*/
|
2484
2647
|
|
2648
|
+
function none(dependentKey) {
|
2649
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2650
|
+
return _emberMetalIs_none["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2651
|
+
});
|
2652
|
+
}
|
2653
|
+
|
2485
2654
|
/**
|
2486
|
-
|
2487
|
-
|
2488
|
-
not mutate the upstream property, rather causes the current property to
|
2489
|
-
become the value set. This causes the downstream property to permanently
|
2490
|
-
diverge from the upstream property.
|
2655
|
+
A computed property that returns the inverse boolean value
|
2656
|
+
of the original value for the dependent property.
|
2491
2657
|
|
2492
2658
|
Example
|
2493
2659
|
|
2494
2660
|
```javascript
|
2495
2661
|
var User = Ember.Object.extend({
|
2496
|
-
|
2497
|
-
lastName: null,
|
2498
|
-
nickName: Ember.computed.oneWay('firstName')
|
2662
|
+
isAnonymous: Ember.computed.not('loggedIn')
|
2499
2663
|
});
|
2500
2664
|
|
2501
|
-
var
|
2502
|
-
firstName: 'Teddy',
|
2503
|
-
lastName: 'Zeenny'
|
2504
|
-
});
|
2665
|
+
var user = User.create({loggedIn: false});
|
2505
2666
|
|
2506
|
-
|
2507
|
-
|
2508
|
-
|
2667
|
+
user.get('isAnonymous'); // true
|
2668
|
+
user.set('loggedIn', true);
|
2669
|
+
user.get('isAnonymous'); // false
|
2509
2670
|
```
|
2510
2671
|
|
2511
|
-
@method
|
2672
|
+
@method not
|
2512
2673
|
@for Ember.computed
|
2513
2674
|
@param {String} dependentKey
|
2514
|
-
@return {Ember.ComputedProperty} computed property which
|
2515
|
-
|
2675
|
+
@return {Ember.ComputedProperty} computed property which returns
|
2676
|
+
inverse of the original value for property
|
2516
2677
|
@public
|
2517
2678
|
*/
|
2518
2679
|
|
2519
|
-
function
|
2520
|
-
return
|
2680
|
+
function not(dependentKey) {
|
2681
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2682
|
+
return !_emberMetalProperty_get.get(this, dependentKey);
|
2683
|
+
});
|
2521
2684
|
}
|
2522
2685
|
|
2523
2686
|
/**
|
2524
|
-
|
2525
|
-
|
2526
|
-
|
2527
|
-
@method reads
|
2528
|
-
@for Ember.computed
|
2529
|
-
@param {String} dependentKey
|
2530
|
-
@return {Ember.ComputedProperty} computed property which creates a
|
2531
|
-
one way computed property to the original value for property.
|
2532
|
-
@public
|
2533
|
-
*/
|
2534
|
-
|
2535
|
-
/**
|
2536
|
-
Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
|
2537
|
-
a readOnly one way binding. Very often when using `computed.oneWay` one does
|
2538
|
-
not also want changes to propagate back up, as they will replace the value.
|
2539
|
-
|
2540
|
-
This prevents the reverse flow, and also throws an exception when it occurs.
|
2541
|
-
|
2542
|
-
Example
|
2687
|
+
A computed property that converts the provided dependent property
|
2688
|
+
into a boolean value.
|
2543
2689
|
|
2544
2690
|
```javascript
|
2545
|
-
var
|
2546
|
-
|
2547
|
-
lastName: null,
|
2548
|
-
nickName: Ember.computed.readOnly('firstName')
|
2691
|
+
var Hamster = Ember.Object.extend({
|
2692
|
+
hasBananas: Ember.computed.bool('numBananas')
|
2549
2693
|
});
|
2550
2694
|
|
2551
|
-
var
|
2552
|
-
firstName: 'Teddy',
|
2553
|
-
lastName: 'Zeenny'
|
2554
|
-
});
|
2695
|
+
var hamster = Hamster.create();
|
2555
2696
|
|
2556
|
-
|
2557
|
-
|
2558
|
-
|
2559
|
-
|
2697
|
+
hamster.get('hasBananas'); // false
|
2698
|
+
hamster.set('numBananas', 0);
|
2699
|
+
hamster.get('hasBananas'); // false
|
2700
|
+
hamster.set('numBananas', 1);
|
2701
|
+
hamster.get('hasBananas'); // true
|
2702
|
+
hamster.set('numBananas', null);
|
2703
|
+
hamster.get('hasBananas'); // false
|
2560
2704
|
```
|
2561
2705
|
|
2562
|
-
@method
|
2706
|
+
@method bool
|
2563
2707
|
@for Ember.computed
|
2564
2708
|
@param {String} dependentKey
|
2565
|
-
@return {Ember.ComputedProperty} computed property which
|
2566
|
-
|
2567
|
-
@since 1.5.0
|
2709
|
+
@return {Ember.ComputedProperty} computed property which converts
|
2710
|
+
to boolean the original value for property
|
2568
2711
|
@public
|
2569
2712
|
*/
|
2570
2713
|
|
2571
|
-
function
|
2572
|
-
return
|
2714
|
+
function bool(dependentKey) {
|
2715
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2716
|
+
return !!_emberMetalProperty_get.get(this, dependentKey);
|
2717
|
+
});
|
2573
2718
|
}
|
2574
2719
|
|
2575
2720
|
/**
|
2576
|
-
A computed property
|
2577
|
-
|
2578
|
-
|
2721
|
+
A computed property which matches the original value for the
|
2722
|
+
dependent property against a given RegExp, returning `true`
|
2723
|
+
if they values matches the RegExp and `false` if it does not.
|
2579
2724
|
|
2580
2725
|
Example
|
2581
2726
|
|
2582
2727
|
```javascript
|
2583
|
-
var
|
2584
|
-
|
2728
|
+
var User = Ember.Object.extend({
|
2729
|
+
hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
|
2585
2730
|
});
|
2586
2731
|
|
2587
|
-
var
|
2732
|
+
var user = User.create({loggedIn: false});
|
2588
2733
|
|
2589
|
-
|
2590
|
-
|
2591
|
-
|
2592
|
-
|
2734
|
+
user.get('hasValidEmail'); // false
|
2735
|
+
user.set('email', '');
|
2736
|
+
user.get('hasValidEmail'); // false
|
2737
|
+
user.set('email', 'ember_hamster@example.com');
|
2738
|
+
user.get('hasValidEmail'); // true
|
2593
2739
|
```
|
2594
2740
|
|
2595
|
-
@method
|
2741
|
+
@method match
|
2596
2742
|
@for Ember.computed
|
2597
|
-
@param {String}
|
2598
|
-
@
|
2599
|
-
|
2600
|
-
|
2743
|
+
@param {String} dependentKey
|
2744
|
+
@param {RegExp} regexp
|
2745
|
+
@return {Ember.ComputedProperty} computed property which match
|
2746
|
+
the original value for property against a given RegExp
|
2601
2747
|
@public
|
2602
2748
|
*/
|
2603
2749
|
|
2604
|
-
function
|
2605
|
-
return _emberMetalComputed.computed({
|
2606
|
-
|
2607
|
-
_emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
|
2608
|
-
return _emberMetalProperty_get.get(this, defaultPath);
|
2609
|
-
},
|
2750
|
+
function match(dependentKey, regexp) {
|
2751
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2752
|
+
var value = _emberMetalProperty_get.get(this, dependentKey);
|
2610
2753
|
|
2611
|
-
|
2612
|
-
_emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
|
2613
|
-
return newValue != null ? newValue : _emberMetalProperty_get.get(this, defaultPath);
|
2614
|
-
}
|
2754
|
+
return typeof value === 'string' ? regexp.test(value) : false;
|
2615
2755
|
});
|
2616
2756
|
}
|
2617
2757
|
|
2618
2758
|
/**
|
2619
|
-
|
2620
|
-
|
2621
|
-
though they were called on the original property, but also
|
2622
|
-
print a deprecation warning.
|
2759
|
+
A computed property that returns true if the provided dependent property
|
2760
|
+
is equal to the given value.
|
2623
2761
|
|
2624
|
-
|
2762
|
+
Example
|
2763
|
+
|
2764
|
+
```javascript
|
2765
|
+
var Hamster = Ember.Object.extend({
|
2766
|
+
napTime: Ember.computed.equal('state', 'sleepy')
|
2767
|
+
});
|
2768
|
+
|
2769
|
+
var hamster = Hamster.create();
|
2770
|
+
|
2771
|
+
hamster.get('napTime'); // false
|
2772
|
+
hamster.set('state', 'sleepy');
|
2773
|
+
hamster.get('napTime'); // true
|
2774
|
+
hamster.set('state', 'hungry');
|
2775
|
+
hamster.get('napTime'); // false
|
2776
|
+
```
|
2777
|
+
|
2778
|
+
@method equal
|
2625
2779
|
@for Ember.computed
|
2626
2780
|
@param {String} dependentKey
|
2627
|
-
@
|
2628
|
-
|
2629
|
-
|
2781
|
+
@param {String|Number|Object} value
|
2782
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2783
|
+
the original value for property is equal to the given value.
|
2630
2784
|
@public
|
2631
2785
|
*/
|
2632
2786
|
|
2633
|
-
function
|
2634
|
-
return _emberMetalComputed.computed(dependentKey, {
|
2635
|
-
get
|
2636
|
-
_emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
|
2637
|
-
return _emberMetalProperty_get.get(this, dependentKey);
|
2638
|
-
},
|
2639
|
-
set: function (key, value) {
|
2640
|
-
_emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
|
2641
|
-
_emberMetalProperty_set.set(this, dependentKey, value);
|
2642
|
-
return value;
|
2643
|
-
}
|
2787
|
+
function equal(dependentKey, value) {
|
2788
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2789
|
+
return _emberMetalProperty_get.get(this, dependentKey) === value;
|
2644
2790
|
});
|
2645
2791
|
}
|
2646
|
-
});
|
2647
|
-
enifed("ember-metal/computed", ["exports", "ember-metal/core", "ember-metal/property_set", "ember-metal/utils", "ember-metal/expand_properties", "ember-metal/error", "ember-metal/properties", "ember-metal/property_events", "ember-metal/dependent_keys"], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
|
2648
|
-
"use strict";
|
2649
|
-
|
2650
|
-
/**
|
2651
|
-
@module ember
|
2652
|
-
@submodule ember-metal
|
2653
|
-
*/
|
2654
|
-
|
2655
|
-
var metaFor = _emberMetalUtils.meta;
|
2656
|
-
|
2657
|
-
function UNDEFINED() {}
|
2658
|
-
|
2659
|
-
// ..........................................................
|
2660
|
-
// COMPUTED PROPERTY
|
2661
|
-
//
|
2662
2792
|
|
2663
2793
|
/**
|
2664
|
-
A computed property
|
2665
|
-
|
2666
|
-
By default the function backing the computed property will only be called
|
2667
|
-
once and the result will be cached. You can specify various properties
|
2668
|
-
that your computed property depends on. This will force the cached
|
2669
|
-
result to be recomputed if the dependencies are modified.
|
2670
|
-
|
2671
|
-
In the following example we declare a computed property (by calling
|
2672
|
-
`.property()` on the fullName function) and setup the property
|
2673
|
-
dependencies (depending on firstName and lastName). The fullName function
|
2674
|
-
will be called once (regardless of how many times it is accessed) as long
|
2675
|
-
as its dependencies have not changed. Once firstName or lastName are updated
|
2676
|
-
any future calls (or anything bound) to fullName will incorporate the new
|
2677
|
-
values.
|
2678
|
-
|
2679
|
-
```javascript
|
2680
|
-
var Person = Ember.Object.extend({
|
2681
|
-
// these will be supplied by `create`
|
2682
|
-
firstName: null,
|
2683
|
-
lastName: null,
|
2684
|
-
|
2685
|
-
fullName: function() {
|
2686
|
-
var firstName = this.get('firstName');
|
2687
|
-
var lastName = this.get('lastName');
|
2794
|
+
A computed property that returns true if the provided dependent property
|
2795
|
+
is greater than the provided value.
|
2688
2796
|
|
2689
|
-
|
2690
|
-
}.property('firstName', 'lastName')
|
2691
|
-
});
|
2797
|
+
Example
|
2692
2798
|
|
2693
|
-
|
2694
|
-
|
2695
|
-
|
2799
|
+
```javascript
|
2800
|
+
var Hamster = Ember.Object.extend({
|
2801
|
+
hasTooManyBananas: Ember.computed.gt('numBananas', 10)
|
2696
2802
|
});
|
2697
2803
|
|
2698
|
-
|
2804
|
+
var hamster = Hamster.create();
|
2805
|
+
|
2806
|
+
hamster.get('hasTooManyBananas'); // false
|
2807
|
+
hamster.set('numBananas', 3);
|
2808
|
+
hamster.get('hasTooManyBananas'); // false
|
2809
|
+
hamster.set('numBananas', 11);
|
2810
|
+
hamster.get('hasTooManyBananas'); // true
|
2699
2811
|
```
|
2700
2812
|
|
2701
|
-
|
2702
|
-
|
2703
|
-
|
2704
|
-
|
2813
|
+
@method gt
|
2814
|
+
@for Ember.computed
|
2815
|
+
@param {String} dependentKey
|
2816
|
+
@param {Number} value
|
2817
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2818
|
+
the original value for property is greater than given value.
|
2819
|
+
@public
|
2820
|
+
*/
|
2821
|
+
|
2822
|
+
function gt(dependentKey, value) {
|
2823
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2824
|
+
return _emberMetalProperty_get.get(this, dependentKey) > value;
|
2825
|
+
});
|
2826
|
+
}
|
2827
|
+
|
2828
|
+
/**
|
2829
|
+
A computed property that returns true if the provided dependent property
|
2830
|
+
is greater than or equal to the provided value.
|
2831
|
+
|
2832
|
+
Example
|
2705
2833
|
|
2706
2834
|
```javascript
|
2707
|
-
var
|
2708
|
-
|
2709
|
-
|
2710
|
-
lastName: null,
|
2835
|
+
var Hamster = Ember.Object.extend({
|
2836
|
+
hasTooManyBananas: Ember.computed.gte('numBananas', 10)
|
2837
|
+
});
|
2711
2838
|
|
2712
|
-
|
2713
|
-
// getter
|
2714
|
-
if (arguments.length === 1) {
|
2715
|
-
var firstName = this.get('firstName');
|
2716
|
-
var lastName = this.get('lastName');
|
2839
|
+
var hamster = Hamster.create();
|
2717
2840
|
|
2718
|
-
|
2841
|
+
hamster.get('hasTooManyBananas'); // false
|
2842
|
+
hamster.set('numBananas', 3);
|
2843
|
+
hamster.get('hasTooManyBananas'); // false
|
2844
|
+
hamster.set('numBananas', 10);
|
2845
|
+
hamster.get('hasTooManyBananas'); // true
|
2846
|
+
```
|
2719
2847
|
|
2720
|
-
|
2721
|
-
|
2722
|
-
|
2848
|
+
@method gte
|
2849
|
+
@for Ember.computed
|
2850
|
+
@param {String} dependentKey
|
2851
|
+
@param {Number} value
|
2852
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2853
|
+
the original value for property is greater or equal then given value.
|
2854
|
+
@public
|
2855
|
+
*/
|
2856
|
+
|
2857
|
+
function gte(dependentKey, value) {
|
2858
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2859
|
+
return _emberMetalProperty_get.get(this, dependentKey) >= value;
|
2860
|
+
});
|
2861
|
+
}
|
2862
|
+
|
2863
|
+
/**
|
2864
|
+
A computed property that returns true if the provided dependent property
|
2865
|
+
is less than the provided value.
|
2723
2866
|
|
2724
|
-
|
2725
|
-
this.set('lastName', name[1]);
|
2867
|
+
Example
|
2726
2868
|
|
2727
|
-
|
2728
|
-
|
2729
|
-
|
2869
|
+
```javascript
|
2870
|
+
var Hamster = Ember.Object.extend({
|
2871
|
+
needsMoreBananas: Ember.computed.lt('numBananas', 3)
|
2730
2872
|
});
|
2731
2873
|
|
2732
|
-
var
|
2874
|
+
var hamster = Hamster.create();
|
2733
2875
|
|
2734
|
-
|
2735
|
-
|
2736
|
-
|
2876
|
+
hamster.get('needsMoreBananas'); // true
|
2877
|
+
hamster.set('numBananas', 3);
|
2878
|
+
hamster.get('needsMoreBananas'); // false
|
2879
|
+
hamster.set('numBananas', 2);
|
2880
|
+
hamster.get('needsMoreBananas'); // true
|
2737
2881
|
```
|
2738
2882
|
|
2739
|
-
@
|
2740
|
-
@
|
2741
|
-
@
|
2883
|
+
@method lt
|
2884
|
+
@for Ember.computed
|
2885
|
+
@param {String} dependentKey
|
2886
|
+
@param {Number} value
|
2887
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2888
|
+
the original value for property is less then given value.
|
2742
2889
|
@public
|
2743
2890
|
*/
|
2744
|
-
function ComputedProperty(config, opts) {
|
2745
|
-
this.isDescriptor = true;
|
2746
|
-
if (typeof config === "function") {
|
2747
|
-
config.__ember_arity = config.length;
|
2748
|
-
this._getter = config;
|
2749
|
-
if (config.__ember_arity > 1) {
|
2750
|
-
_emberMetalCore["default"].deprecate("Using the same function as getter and setter is deprecated.", false, {
|
2751
|
-
url: "http://emberjs.com/deprecations/v1.x/#toc_deprecate-using-the-same-function-as-getter-and-setter-in-computed-properties"
|
2752
|
-
});
|
2753
|
-
this._setter = config;
|
2754
|
-
}
|
2755
|
-
} else {
|
2756
|
-
this._getter = config.get;
|
2757
|
-
this._setter = config.set;
|
2758
|
-
if (this._setter && this._setter.__ember_arity === undefined) {
|
2759
|
-
this._setter.__ember_arity = this._setter.length;
|
2760
|
-
}
|
2761
|
-
}
|
2762
|
-
|
2763
|
-
this._dependentKeys = undefined;
|
2764
|
-
this._suspended = undefined;
|
2765
|
-
this._meta = undefined;
|
2766
2891
|
|
2767
|
-
|
2768
|
-
|
2769
|
-
|
2770
|
-
|
2771
|
-
this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
|
2892
|
+
function lt(dependentKey, value) {
|
2893
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2894
|
+
return _emberMetalProperty_get.get(this, dependentKey) < value;
|
2895
|
+
});
|
2772
2896
|
}
|
2773
2897
|
|
2774
|
-
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
2775
|
-
|
2776
|
-
var ComputedPropertyPrototype = ComputedProperty.prototype;
|
2777
|
-
|
2778
2898
|
/**
|
2779
|
-
|
2780
|
-
|
2899
|
+
A computed property that returns true if the provided dependent property
|
2900
|
+
is less than or equal to the provided value.
|
2781
2901
|
|
2782
|
-
|
2783
|
-
the computed property will not automatically cache the return value.
|
2902
|
+
Example
|
2784
2903
|
|
2785
|
-
|
2786
|
-
|
2904
|
+
```javascript
|
2905
|
+
var Hamster = Ember.Object.extend({
|
2906
|
+
needsMoreBananas: Ember.computed.lte('numBananas', 3)
|
2907
|
+
});
|
2787
2908
|
|
2788
|
-
|
2789
|
-
|
2790
|
-
|
2791
|
-
|
2792
|
-
|
2909
|
+
var hamster = Hamster.create();
|
2910
|
+
|
2911
|
+
hamster.get('needsMoreBananas'); // true
|
2912
|
+
hamster.set('numBananas', 5);
|
2913
|
+
hamster.get('needsMoreBananas'); // false
|
2914
|
+
hamster.set('numBananas', 3);
|
2915
|
+
hamster.get('needsMoreBananas'); // true
|
2916
|
+
```
|
2917
|
+
|
2918
|
+
@method lte
|
2919
|
+
@for Ember.computed
|
2920
|
+
@param {String} dependentKey
|
2921
|
+
@param {Number} value
|
2922
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2923
|
+
the original value for property is less or equal than given value.
|
2793
2924
|
@public
|
2794
2925
|
*/
|
2795
|
-
|
2796
|
-
|
2797
|
-
|
2798
|
-
|
2799
|
-
|
2926
|
+
|
2927
|
+
function lte(dependentKey, value) {
|
2928
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2929
|
+
return _emberMetalProperty_get.get(this, dependentKey) <= value;
|
2930
|
+
});
|
2931
|
+
}
|
2800
2932
|
|
2801
2933
|
/**
|
2802
|
-
|
2803
|
-
|
2934
|
+
A computed property that performs a logical `and` on the
|
2935
|
+
original values for the provided dependent properties.
|
2936
|
+
|
2937
|
+
Example
|
2804
2938
|
|
2805
2939
|
```javascript
|
2806
|
-
var
|
2807
|
-
|
2808
|
-
|
2809
|
-
|
2810
|
-
|
2940
|
+
var Hamster = Ember.Object.extend({
|
2941
|
+
readyForCamp: Ember.computed.and('hasTent', 'hasBackpack')
|
2942
|
+
});
|
2943
|
+
|
2944
|
+
var hamster = Hamster.create();
|
2945
|
+
|
2946
|
+
hamster.get('readyForCamp'); // false
|
2947
|
+
hamster.set('hasTent', true);
|
2948
|
+
hamster.get('readyForCamp'); // false
|
2949
|
+
hamster.set('hasBackpack', true);
|
2950
|
+
hamster.get('readyForCamp'); // true
|
2951
|
+
hamster.set('hasBackpack', 'Yes');
|
2952
|
+
hamster.get('readyForCamp'); // 'Yes'
|
2811
2953
|
```
|
2812
2954
|
|
2813
|
-
@method
|
2814
|
-
@
|
2815
|
-
@
|
2955
|
+
@method and
|
2956
|
+
@for Ember.computed
|
2957
|
+
@param {String} dependentKey*
|
2958
|
+
@return {Ember.ComputedProperty} computed property which performs
|
2959
|
+
a logical `and` on the values of all the original values for properties.
|
2816
2960
|
@public
|
2817
2961
|
*/
|
2818
|
-
|
2819
|
-
|
2820
|
-
|
2821
|
-
|
2962
|
+
var and = generateComputedWithProperties(function (properties) {
|
2963
|
+
var value;
|
2964
|
+
for (var key in properties) {
|
2965
|
+
value = properties[key];
|
2966
|
+
if (properties.hasOwnProperty(key) && !value) {
|
2967
|
+
return false;
|
2968
|
+
}
|
2969
|
+
}
|
2970
|
+
return value;
|
2971
|
+
});
|
2822
2972
|
|
2973
|
+
exports.and = and;
|
2823
2974
|
/**
|
2824
|
-
|
2825
|
-
|
2975
|
+
A computed property which performs a logical `or` on the
|
2976
|
+
original values for the provided dependent properties.
|
2977
|
+
|
2978
|
+
Example
|
2826
2979
|
|
2827
2980
|
```javascript
|
2828
|
-
var
|
2829
|
-
|
2830
|
-
return 'guid-guid-guid';
|
2831
|
-
}.property().readOnly()
|
2981
|
+
var Hamster = Ember.Object.extend({
|
2982
|
+
readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
|
2832
2983
|
});
|
2833
2984
|
|
2834
|
-
var
|
2985
|
+
var hamster = Hamster.create();
|
2835
2986
|
|
2836
|
-
|
2987
|
+
hamster.get('readyForRain'); // false
|
2988
|
+
hamster.set('hasUmbrella', true);
|
2989
|
+
hamster.get('readyForRain'); // true
|
2990
|
+
hamster.set('hasJacket', 'Yes');
|
2991
|
+
hamster.get('readyForRain'); // 'Yes'
|
2837
2992
|
```
|
2838
2993
|
|
2839
|
-
@method
|
2840
|
-
@
|
2841
|
-
@
|
2994
|
+
@method or
|
2995
|
+
@for Ember.computed
|
2996
|
+
@param {String} dependentKey*
|
2997
|
+
@return {Ember.ComputedProperty} computed property which performs
|
2998
|
+
a logical `or` on the values of all the original values for properties.
|
2842
2999
|
@public
|
2843
3000
|
*/
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
3001
|
+
var or = generateComputedWithProperties(function (properties) {
|
3002
|
+
for (var key in properties) {
|
3003
|
+
if (properties.hasOwnProperty(key) && properties[key]) {
|
3004
|
+
return properties[key];
|
3005
|
+
}
|
3006
|
+
}
|
3007
|
+
return false;
|
3008
|
+
});
|
2850
3009
|
|
3010
|
+
exports.or = or;
|
2851
3011
|
/**
|
2852
|
-
|
2853
|
-
|
3012
|
+
A computed property that returns the first truthy value
|
3013
|
+
from a list of dependent properties.
|
2854
3014
|
|
2855
|
-
|
2856
|
-
var President = Ember.Object.extend({
|
2857
|
-
fullName: computed(function() {
|
2858
|
-
return this.get('firstName') + ' ' + this.get('lastName');
|
3015
|
+
Example
|
2859
3016
|
|
2860
|
-
|
2861
|
-
|
2862
|
-
|
3017
|
+
```javascript
|
3018
|
+
var Hamster = Ember.Object.extend({
|
3019
|
+
hasClothes: Ember.computed.any('hat', 'shirt')
|
2863
3020
|
});
|
2864
3021
|
|
2865
|
-
var
|
2866
|
-
firstName: 'Barack',
|
2867
|
-
lastName: 'Obama'
|
2868
|
-
});
|
3022
|
+
var hamster = Hamster.create();
|
2869
3023
|
|
2870
|
-
|
3024
|
+
hamster.get('hasClothes'); // null
|
3025
|
+
hamster.set('shirt', 'Hawaiian Shirt');
|
3026
|
+
hamster.get('hasClothes'); // 'Hawaiian Shirt'
|
2871
3027
|
```
|
2872
3028
|
|
2873
|
-
@method
|
2874
|
-
@
|
2875
|
-
@
|
2876
|
-
@
|
3029
|
+
@method any
|
3030
|
+
@for Ember.computed
|
3031
|
+
@param {String} dependentKey*
|
3032
|
+
@return {Ember.ComputedProperty} computed property which returns
|
3033
|
+
the first truthy value of given list of properties.
|
3034
|
+
@deprecated Use `Ember.computed.or` instead.
|
2877
3035
|
@public
|
2878
3036
|
*/
|
2879
|
-
|
2880
|
-
|
2881
|
-
|
2882
|
-
|
2883
|
-
|
2884
|
-
|
2885
|
-
args.push(property);
|
2886
|
-
};
|
2887
|
-
|
2888
|
-
args = [];
|
2889
|
-
for (var i = 0, l = arguments.length; i < l; i++) {
|
2890
|
-
_emberMetalExpand_properties["default"](arguments[i], addArg);
|
3037
|
+
var any = generateComputedWithProperties(function (properties) {
|
3038
|
+
_emberMetalCore["default"].deprecate('Usage of Ember.computed.any is deprecated, use `Ember.computed.or` instead.');
|
3039
|
+
for (var key in properties) {
|
3040
|
+
if (properties.hasOwnProperty(key) && properties[key]) {
|
3041
|
+
return properties[key];
|
3042
|
+
}
|
2891
3043
|
}
|
3044
|
+
return null;
|
3045
|
+
});
|
2892
3046
|
|
2893
|
-
|
2894
|
-
return this;
|
2895
|
-
};
|
2896
|
-
|
3047
|
+
exports.any = any;
|
2897
3048
|
/**
|
2898
|
-
|
2899
|
-
|
2900
|
-
computed property functions may close over variables that are then no longer
|
2901
|
-
available for introspection.
|
3049
|
+
A computed property that returns the array of values
|
3050
|
+
for the provided dependent properties.
|
2902
3051
|
|
2903
|
-
|
3052
|
+
Example
|
2904
3053
|
|
2905
|
-
```
|
2906
|
-
|
2907
|
-
|
2908
|
-
|
2909
|
-
}.property().meta({ type: App.Person })
|
2910
|
-
```
|
3054
|
+
```javascript
|
3055
|
+
var Hamster = Ember.Object.extend({
|
3056
|
+
clothes: Ember.computed.collect('hat', 'shirt')
|
3057
|
+
});
|
2911
3058
|
|
2912
|
-
|
2913
|
-
computed property descriptor under the `_meta` key. Ember runtime
|
2914
|
-
exposes a public API for retrieving these values from classes,
|
2915
|
-
via the `metaForProperty()` function.
|
3059
|
+
var hamster = Hamster.create();
|
2916
3060
|
|
2917
|
-
|
2918
|
-
|
2919
|
-
|
3061
|
+
hamster.get('clothes'); // [null, null]
|
3062
|
+
hamster.set('hat', 'Camp Hat');
|
3063
|
+
hamster.set('shirt', 'Camp Shirt');
|
3064
|
+
hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
|
3065
|
+
```
|
3066
|
+
|
3067
|
+
@method collect
|
3068
|
+
@for Ember.computed
|
3069
|
+
@param {String} dependentKey*
|
3070
|
+
@return {Ember.ComputedProperty} computed property which maps
|
3071
|
+
values of all passed in properties to an array.
|
2920
3072
|
@public
|
2921
3073
|
*/
|
2922
|
-
|
2923
|
-
|
2924
|
-
|
2925
|
-
|
2926
|
-
|
2927
|
-
|
2928
|
-
|
2929
|
-
|
2930
|
-
|
2931
|
-
|
2932
|
-
/* impl descriptor API */
|
2933
|
-
ComputedPropertyPrototype.didChange = function (obj, keyName) {
|
2934
|
-
// _suspended is set via a CP.set to ensure we don't clear
|
2935
|
-
// the cached value set by the setter
|
2936
|
-
if (this._cacheable && this._suspended !== obj) {
|
2937
|
-
var meta = metaFor(obj);
|
2938
|
-
if (meta.cache && meta.cache[keyName] !== undefined) {
|
2939
|
-
meta.cache[keyName] = undefined;
|
2940
|
-
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
3074
|
+
var collect = generateComputedWithProperties(function (properties) {
|
3075
|
+
var res = _emberMetalCore["default"].A();
|
3076
|
+
for (var key in properties) {
|
3077
|
+
if (properties.hasOwnProperty(key)) {
|
3078
|
+
if (_emberMetalIs_none["default"](properties[key])) {
|
3079
|
+
res.push(null);
|
3080
|
+
} else {
|
3081
|
+
res.push(properties[key]);
|
3082
|
+
}
|
2941
3083
|
}
|
2942
3084
|
}
|
2943
|
-
|
2944
|
-
|
2945
|
-
function finishChains(chainNodes) {
|
2946
|
-
for (var i = 0, l = chainNodes.length; i < l; i++) {
|
2947
|
-
chainNodes[i].didChange(null);
|
2948
|
-
}
|
2949
|
-
}
|
3085
|
+
return res;
|
3086
|
+
});
|
2950
3087
|
|
3088
|
+
exports.collect = collect;
|
2951
3089
|
/**
|
2952
|
-
|
2953
|
-
|
2954
|
-
|
3090
|
+
Creates a new property that is an alias for another property
|
3091
|
+
on an object. Calls to `get` or `set` this property behave as
|
3092
|
+
though they were called on the original property.
|
2955
3093
|
|
2956
3094
|
```javascript
|
2957
3095
|
var Person = Ember.Object.extend({
|
2958
|
-
|
2959
|
-
|
2960
|
-
return this.get('firstName') + ' ' + this.get('lastName');
|
2961
|
-
}.property('firstName', 'lastName')
|
3096
|
+
name: 'Alex Matchneer',
|
3097
|
+
nomen: Ember.computed.alias('name')
|
2962
3098
|
});
|
2963
3099
|
|
3100
|
+
var alex = Person.create();
|
2964
3101
|
|
2965
|
-
|
2966
|
-
|
2967
|
-
lastName: 'Dale'
|
2968
|
-
});
|
3102
|
+
alex.get('nomen'); // 'Alex Matchneer'
|
3103
|
+
alex.get('name'); // 'Alex Matchneer'
|
2969
3104
|
|
2970
|
-
|
3105
|
+
alex.set('nomen', '@machty');
|
3106
|
+
alex.get('name'); // '@machty'
|
2971
3107
|
```
|
2972
3108
|
|
2973
|
-
@method
|
2974
|
-
@
|
2975
|
-
@
|
3109
|
+
@method alias
|
3110
|
+
@for Ember.computed
|
3111
|
+
@param {String} dependentKey
|
3112
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
3113
|
+
alias to the original value for property.
|
2976
3114
|
@public
|
2977
3115
|
*/
|
2978
|
-
ComputedPropertyPrototype.get = function (obj, keyName) {
|
2979
|
-
var ret, cache, meta, chainNodes;
|
2980
|
-
if (this._cacheable) {
|
2981
|
-
meta = metaFor(obj);
|
2982
|
-
cache = meta.cache;
|
2983
|
-
|
2984
|
-
var result = cache && cache[keyName];
|
2985
|
-
|
2986
|
-
if (result === UNDEFINED) {
|
2987
|
-
return undefined;
|
2988
|
-
} else if (result !== undefined) {
|
2989
|
-
return result;
|
2990
|
-
}
|
2991
|
-
|
2992
|
-
ret = this._getter.call(obj, keyName);
|
2993
|
-
cache = meta.cache;
|
2994
|
-
if (!cache) {
|
2995
|
-
cache = meta.cache = {};
|
2996
|
-
}
|
2997
|
-
if (ret === undefined) {
|
2998
|
-
cache[keyName] = UNDEFINED;
|
2999
|
-
} else {
|
3000
|
-
cache[keyName] = ret;
|
3001
|
-
}
|
3002
|
-
|
3003
|
-
chainNodes = meta.chainWatchers && meta.chainWatchers[keyName];
|
3004
|
-
if (chainNodes) {
|
3005
|
-
finishChains(chainNodes);
|
3006
|
-
}
|
3007
|
-
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
3008
|
-
} else {
|
3009
|
-
ret = this._getter.call(obj, keyName);
|
3010
|
-
}
|
3011
|
-
return ret;
|
3012
|
-
};
|
3013
3116
|
|
3014
3117
|
/**
|
3015
|
-
|
3016
|
-
|
3017
|
-
|
3018
|
-
the value
|
3118
|
+
Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
|
3119
|
+
data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
|
3120
|
+
not mutate the upstream property, rather causes the current property to
|
3121
|
+
become the value set. This causes the downstream property to permanently
|
3122
|
+
diverge from the upstream property.
|
3019
3123
|
|
3020
|
-
|
3021
|
-
your backing function should accept either two or three arguments.
|
3124
|
+
Example
|
3022
3125
|
|
3023
3126
|
```javascript
|
3024
|
-
var
|
3025
|
-
// these will be supplied by `create`
|
3127
|
+
var User = Ember.Object.extend({
|
3026
3128
|
firstName: null,
|
3027
3129
|
lastName: null,
|
3130
|
+
nickName: Ember.computed.oneWay('firstName')
|
3131
|
+
});
|
3028
3132
|
|
3029
|
-
|
3030
|
-
|
3031
|
-
|
3032
|
-
var firstName = this.get('firstName');
|
3033
|
-
var lastName = this.get('lastName');
|
3034
|
-
|
3035
|
-
return firstName + ' ' + lastName;
|
3036
|
-
|
3037
|
-
// setter
|
3038
|
-
} else {
|
3039
|
-
var name = value.split(' ');
|
3040
|
-
|
3041
|
-
this.set('firstName', name[0]);
|
3042
|
-
this.set('lastName', name[1]);
|
3043
|
-
|
3044
|
-
return value;
|
3045
|
-
}
|
3046
|
-
}.property('firstName', 'lastName')
|
3133
|
+
var teddy = User.create({
|
3134
|
+
firstName: 'Teddy',
|
3135
|
+
lastName: 'Zeenny'
|
3047
3136
|
});
|
3048
3137
|
|
3049
|
-
|
3050
|
-
|
3051
|
-
|
3052
|
-
person.get('firstName'); // 'Peter'
|
3053
|
-
person.get('lastName'); // 'Wagenet'
|
3138
|
+
teddy.get('nickName'); // 'Teddy'
|
3139
|
+
teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
|
3140
|
+
teddy.get('firstName'); // 'Teddy'
|
3054
3141
|
```
|
3055
3142
|
|
3056
|
-
@method
|
3057
|
-
@
|
3058
|
-
@param {
|
3059
|
-
@
|
3060
|
-
|
3143
|
+
@method oneWay
|
3144
|
+
@for Ember.computed
|
3145
|
+
@param {String} dependentKey
|
3146
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3147
|
+
one way computed property to the original value for property.
|
3061
3148
|
@public
|
3062
3149
|
*/
|
3063
|
-
ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
|
3064
|
-
var oldSuspended = this._suspended;
|
3065
|
-
|
3066
|
-
this._suspended = obj;
|
3067
|
-
|
3068
|
-
try {
|
3069
|
-
this._set(obj, keyName, value);
|
3070
|
-
} finally {
|
3071
|
-
this._suspended = oldSuspended;
|
3072
|
-
}
|
3073
|
-
};
|
3074
|
-
|
3075
|
-
ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
|
3076
|
-
var cacheable = this._cacheable;
|
3077
|
-
var setter = this._setter;
|
3078
|
-
var meta = metaFor(obj, cacheable);
|
3079
|
-
var cache = meta.cache;
|
3080
|
-
var hadCachedValue = false;
|
3081
|
-
|
3082
|
-
var cachedValue, ret;
|
3083
|
-
|
3084
|
-
if (this._readOnly) {
|
3085
|
-
throw new _emberMetalError["default"]("Cannot set read-only property \"" + keyName + "\" on object: " + _emberMetalUtils.inspect(obj));
|
3086
|
-
}
|
3087
|
-
|
3088
|
-
if (cacheable && cache && cache[keyName] !== undefined) {
|
3089
|
-
if (cache[keyName] !== UNDEFINED) {
|
3090
|
-
cachedValue = cache[keyName];
|
3091
|
-
}
|
3092
|
-
|
3093
|
-
hadCachedValue = true;
|
3094
|
-
}
|
3095
|
-
|
3096
|
-
if (!setter) {
|
3097
|
-
_emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
|
3098
|
-
_emberMetalProperty_set.set(obj, keyName, value);
|
3099
|
-
return;
|
3100
|
-
} else if (setter.__ember_arity === 2) {
|
3101
|
-
// Is there any way of deprecate this in a sensitive way?
|
3102
|
-
// Maybe now that getters and setters are the prefered options we can....
|
3103
|
-
ret = setter.call(obj, keyName, value);
|
3104
|
-
} else {
|
3105
|
-
ret = setter.call(obj, keyName, value, cachedValue);
|
3106
|
-
}
|
3107
|
-
|
3108
|
-
if (hadCachedValue && cachedValue === ret) {
|
3109
|
-
return;
|
3110
|
-
}
|
3111
|
-
|
3112
|
-
var watched = meta.watching[keyName];
|
3113
|
-
if (watched) {
|
3114
|
-
_emberMetalProperty_events.propertyWillChange(obj, keyName);
|
3115
|
-
}
|
3116
|
-
|
3117
|
-
if (hadCachedValue) {
|
3118
|
-
cache[keyName] = undefined;
|
3119
|
-
}
|
3120
|
-
|
3121
|
-
if (cacheable) {
|
3122
|
-
if (!hadCachedValue) {
|
3123
|
-
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
3124
|
-
}
|
3125
|
-
if (!cache) {
|
3126
|
-
cache = meta.cache = {};
|
3127
|
-
}
|
3128
|
-
if (ret === undefined) {
|
3129
|
-
cache[keyName] = UNDEFINED;
|
3130
|
-
} else {
|
3131
|
-
cache[keyName] = ret;
|
3132
|
-
}
|
3133
|
-
}
|
3134
|
-
|
3135
|
-
if (watched) {
|
3136
|
-
_emberMetalProperty_events.propertyDidChange(obj, keyName);
|
3137
|
-
}
|
3138
|
-
|
3139
|
-
return ret;
|
3140
|
-
};
|
3141
|
-
|
3142
|
-
/* called before property is overridden */
|
3143
|
-
ComputedPropertyPrototype.teardown = function (obj, keyName) {
|
3144
|
-
var meta = metaFor(obj);
|
3145
|
-
|
3146
|
-
if (meta.cache) {
|
3147
|
-
if (keyName in meta.cache) {
|
3148
|
-
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
3149
|
-
}
|
3150
3150
|
|
3151
|
-
|
3152
|
-
|
3153
|
-
|
3154
|
-
}
|
3151
|
+
function oneWay(dependentKey) {
|
3152
|
+
return _emberMetalAlias["default"](dependentKey).oneWay();
|
3153
|
+
}
|
3155
3154
|
|
3156
|
-
|
3157
|
-
|
3155
|
+
/**
|
3156
|
+
This is a more semantically meaningful alias of `computed.oneWay`,
|
3157
|
+
whose name is somewhat ambiguous as to which direction the data flows.
|
3158
|
+
|
3159
|
+
@method reads
|
3160
|
+
@for Ember.computed
|
3161
|
+
@param {String} dependentKey
|
3162
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3163
|
+
one way computed property to the original value for property.
|
3164
|
+
@public
|
3165
|
+
*/
|
3158
3166
|
|
3159
3167
|
/**
|
3160
|
-
|
3161
|
-
|
3162
|
-
|
3168
|
+
Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
|
3169
|
+
a readOnly one way binding. Very often when using `computed.oneWay` one does
|
3170
|
+
not also want changes to propagate back up, as they will replace the value.
|
3163
3171
|
|
3164
|
-
|
3165
|
-
The function should accept two parameters, key and value. If value is not
|
3166
|
-
undefined you should set the value first. In either case return the
|
3167
|
-
current value of the property.
|
3172
|
+
This prevents the reverse flow, and also throws an exception when it occurs.
|
3168
3173
|
|
3169
|
-
|
3174
|
+
Example
|
3170
3175
|
|
3171
|
-
```
|
3172
|
-
var
|
3173
|
-
firstName:
|
3174
|
-
lastName:
|
3176
|
+
```javascript
|
3177
|
+
var User = Ember.Object.extend({
|
3178
|
+
firstName: null,
|
3179
|
+
lastName: null,
|
3180
|
+
nickName: Ember.computed.readOnly('firstName')
|
3181
|
+
});
|
3175
3182
|
|
3176
|
-
|
3177
|
-
|
3178
|
-
|
3183
|
+
var teddy = User.create({
|
3184
|
+
firstName: 'Teddy',
|
3185
|
+
lastName: 'Zeenny'
|
3179
3186
|
});
|
3180
3187
|
|
3181
|
-
|
3188
|
+
teddy.get('nickName'); // 'Teddy'
|
3189
|
+
teddy.set('nickName', 'TeddyBear'); // throws Exception
|
3190
|
+
// throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
|
3191
|
+
teddy.get('firstName'); // 'Teddy'
|
3192
|
+
```
|
3182
3193
|
|
3183
|
-
|
3194
|
+
@method readOnly
|
3195
|
+
@for Ember.computed
|
3196
|
+
@param {String} dependentKey
|
3197
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3198
|
+
one way computed property to the original value for property.
|
3199
|
+
@since 1.5.0
|
3200
|
+
@public
|
3201
|
+
*/
|
3202
|
+
|
3203
|
+
function readOnly(dependentKey) {
|
3204
|
+
return _emberMetalAlias["default"](dependentKey).readOnly();
|
3205
|
+
}
|
3206
|
+
|
3207
|
+
/**
|
3208
|
+
A computed property that acts like a standard getter and setter,
|
3209
|
+
but returns the value at the provided `defaultPath` if the
|
3210
|
+
property itself has not been set to a value
|
3184
3211
|
|
3185
|
-
|
3186
|
-
client.get('fullName'); // 'Betty Fuller'
|
3187
|
-
```
|
3212
|
+
Example
|
3188
3213
|
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3214
|
+
```javascript
|
3215
|
+
var Hamster = Ember.Object.extend({
|
3216
|
+
wishList: Ember.computed.defaultTo('favoriteFood')
|
3217
|
+
});
|
3192
3218
|
|
3193
|
-
|
3194
|
-
[Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
|
3195
|
-
The alternative syntax might look like this
|
3196
|
-
(if prototype extensions are enabled, which is the default behavior):
|
3219
|
+
var hamster = Hamster.create({ favoriteFood: 'Banana' });
|
3197
3220
|
|
3198
|
-
|
3199
|
-
|
3200
|
-
|
3201
|
-
|
3221
|
+
hamster.get('wishList'); // 'Banana'
|
3222
|
+
hamster.set('wishList', 'More Unit Tests');
|
3223
|
+
hamster.get('wishList'); // 'More Unit Tests'
|
3224
|
+
hamster.get('favoriteFood'); // 'Banana'
|
3202
3225
|
```
|
3203
3226
|
|
3204
|
-
@
|
3205
|
-
@
|
3206
|
-
@
|
3207
|
-
@
|
3208
|
-
|
3209
|
-
@
|
3210
|
-
@return {Ember.ComputedProperty} property descriptor instance
|
3227
|
+
@method defaultTo
|
3228
|
+
@for Ember.computed
|
3229
|
+
@param {String} defaultPath
|
3230
|
+
@return {Ember.ComputedProperty} computed property which acts like
|
3231
|
+
a standard getter and setter, but defaults to the value from `defaultPath`.
|
3232
|
+
@deprecated Use `Ember.computed.oneWay` or custom CP with default instead.
|
3211
3233
|
@public
|
3212
3234
|
*/
|
3213
|
-
function computed(func) {
|
3214
|
-
var args;
|
3215
|
-
|
3216
|
-
if (arguments.length > 1) {
|
3217
|
-
args = [].slice.call(arguments);
|
3218
|
-
func = args.pop();
|
3219
|
-
}
|
3220
|
-
|
3221
|
-
var cp = new ComputedProperty(func);
|
3222
3235
|
|
3223
|
-
|
3224
|
-
|
3225
|
-
|
3236
|
+
function defaultTo(defaultPath) {
|
3237
|
+
return _emberMetalComputed.computed({
|
3238
|
+
get: function (key) {
|
3239
|
+
_emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
|
3240
|
+
return _emberMetalProperty_get.get(this, defaultPath);
|
3241
|
+
},
|
3226
3242
|
|
3227
|
-
|
3243
|
+
set: function (key, newValue, cachedValue) {
|
3244
|
+
_emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
|
3245
|
+
return newValue != null ? newValue : _emberMetalProperty_get.get(this, defaultPath);
|
3246
|
+
}
|
3247
|
+
});
|
3228
3248
|
}
|
3229
3249
|
|
3230
3250
|
/**
|
3231
|
-
|
3232
|
-
|
3233
|
-
|
3234
|
-
|
3251
|
+
Creates a new property that is an alias for another property
|
3252
|
+
on an object. Calls to `get` or `set` this property behave as
|
3253
|
+
though they were called on the original property, but also
|
3254
|
+
print a deprecation warning.
|
3235
3255
|
|
3236
|
-
@method
|
3237
|
-
@for Ember
|
3238
|
-
@param {
|
3239
|
-
@
|
3240
|
-
|
3241
|
-
@
|
3256
|
+
@method deprecatingAlias
|
3257
|
+
@for Ember.computed
|
3258
|
+
@param {String} dependentKey
|
3259
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
3260
|
+
alias with a deprecation to the original value for property.
|
3261
|
+
@since 1.7.0
|
3242
3262
|
@public
|
3243
3263
|
*/
|
3244
|
-
function cacheFor(obj, key) {
|
3245
|
-
var meta = obj['__ember_meta__'];
|
3246
|
-
var cache = meta && meta.cache;
|
3247
|
-
var ret = cache && cache[key];
|
3248
3264
|
|
3249
|
-
|
3250
|
-
|
3251
|
-
|
3252
|
-
|
3265
|
+
function deprecatingAlias(dependentKey) {
|
3266
|
+
return _emberMetalComputed.computed(dependentKey, {
|
3267
|
+
get: function (key) {
|
3268
|
+
_emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
|
3269
|
+
return _emberMetalProperty_get.get(this, dependentKey);
|
3270
|
+
},
|
3271
|
+
set: function (key, value) {
|
3272
|
+
_emberMetalCore["default"].deprecate("Usage of `" + key + "` is deprecated, use `" + dependentKey + "` instead.");
|
3273
|
+
_emberMetalProperty_set.set(this, dependentKey, value);
|
3274
|
+
return value;
|
3275
|
+
}
|
3276
|
+
});
|
3253
3277
|
}
|
3254
|
-
|
3255
|
-
cacheFor.set = function (cache, key, value) {
|
3256
|
-
if (value === undefined) {
|
3257
|
-
cache[key] = UNDEFINED;
|
3258
|
-
} else {
|
3259
|
-
cache[key] = value;
|
3260
|
-
}
|
3261
|
-
};
|
3262
|
-
|
3263
|
-
cacheFor.get = function (cache, key) {
|
3264
|
-
var ret = cache[key];
|
3265
|
-
if (ret === UNDEFINED) {
|
3266
|
-
return undefined;
|
3267
|
-
}
|
3268
|
-
return ret;
|
3269
|
-
};
|
3270
|
-
|
3271
|
-
cacheFor.remove = function (cache, key) {
|
3272
|
-
cache[key] = undefined;
|
3273
|
-
};
|
3274
|
-
|
3275
|
-
exports.ComputedProperty = ComputedProperty;
|
3276
|
-
exports.computed = computed;
|
3277
|
-
exports.cacheFor = cacheFor;
|
3278
3278
|
});
|
3279
3279
|
enifed('ember-metal/core', ['exports'], function (exports) {
|
3280
3280
|
/*globals Ember:true,ENV,EmberENV */
|
@@ -3299,7 +3299,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
|
|
3299
3299
|
|
3300
3300
|
@class Ember
|
3301
3301
|
@static
|
3302
|
-
@version 1.13.
|
3302
|
+
@version 1.13.13
|
3303
3303
|
@public
|
3304
3304
|
*/
|
3305
3305
|
|
@@ -3333,11 +3333,11 @@ enifed('ember-metal/core', ['exports'], function (exports) {
|
|
3333
3333
|
|
3334
3334
|
@property VERSION
|
3335
3335
|
@type String
|
3336
|
-
@default '1.13.
|
3336
|
+
@default '1.13.13'
|
3337
3337
|
@static
|
3338
3338
|
@public
|
3339
3339
|
*/
|
3340
|
-
Ember.VERSION = '1.13.
|
3340
|
+
Ember.VERSION = '1.13.13';
|
3341
3341
|
|
3342
3342
|
/**
|
3343
3343
|
The hash of environment variables used to control various configuration
|
@@ -6980,75 +6980,6 @@ enifed("ember-metal/mixin", ["exports", "ember-metal/core", "ember-metal/merge",
|
|
6980
6980
|
exports.REQUIRED = REQUIRED;
|
6981
6981
|
});
|
6982
6982
|
// warn, assert, wrap, et;
|
6983
|
-
enifed("ember-metal/observer_set", ["exports", "ember-metal/utils", "ember-metal/events"], function (exports, _emberMetalUtils, _emberMetalEvents) {
|
6984
|
-
"use strict";
|
6985
|
-
|
6986
|
-
/*
|
6987
|
-
this.observerSet = {
|
6988
|
-
[senderGuid]: { // variable name: `keySet`
|
6989
|
-
[keyName]: listIndex
|
6990
|
-
}
|
6991
|
-
},
|
6992
|
-
this.observers = [
|
6993
|
-
{
|
6994
|
-
sender: obj,
|
6995
|
-
keyName: keyName,
|
6996
|
-
eventName: eventName,
|
6997
|
-
listeners: [
|
6998
|
-
[target, method, flags]
|
6999
|
-
]
|
7000
|
-
},
|
7001
|
-
...
|
7002
|
-
]
|
7003
|
-
*/
|
7004
|
-
exports["default"] = ObserverSet;
|
7005
|
-
|
7006
|
-
function ObserverSet() {
|
7007
|
-
this.clear();
|
7008
|
-
}
|
7009
|
-
|
7010
|
-
ObserverSet.prototype.add = function (sender, keyName, eventName) {
|
7011
|
-
var observerSet = this.observerSet;
|
7012
|
-
var observers = this.observers;
|
7013
|
-
var senderGuid = _emberMetalUtils.guidFor(sender);
|
7014
|
-
var keySet = observerSet[senderGuid];
|
7015
|
-
var index;
|
7016
|
-
|
7017
|
-
if (!keySet) {
|
7018
|
-
observerSet[senderGuid] = keySet = {};
|
7019
|
-
}
|
7020
|
-
index = keySet[keyName];
|
7021
|
-
if (index === undefined) {
|
7022
|
-
index = observers.push({
|
7023
|
-
sender: sender,
|
7024
|
-
keyName: keyName,
|
7025
|
-
eventName: eventName,
|
7026
|
-
listeners: []
|
7027
|
-
}) - 1;
|
7028
|
-
keySet[keyName] = index;
|
7029
|
-
}
|
7030
|
-
return observers[index].listeners;
|
7031
|
-
};
|
7032
|
-
|
7033
|
-
ObserverSet.prototype.flush = function () {
|
7034
|
-
var observers = this.observers;
|
7035
|
-
var i, len, observer, sender;
|
7036
|
-
this.clear();
|
7037
|
-
for (i = 0, len = observers.length; i < len; ++i) {
|
7038
|
-
observer = observers[i];
|
7039
|
-
sender = observer.sender;
|
7040
|
-
if (sender.isDestroying || sender.isDestroyed) {
|
7041
|
-
continue;
|
7042
|
-
}
|
7043
|
-
_emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
|
7044
|
-
}
|
7045
|
-
};
|
7046
|
-
|
7047
|
-
ObserverSet.prototype.clear = function () {
|
7048
|
-
this.observerSet = {};
|
7049
|
-
this.observers = [];
|
7050
|
-
};
|
7051
|
-
});
|
7052
6983
|
enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/array", "ember-metal/events"], function (exports, _emberMetalWatching, _emberMetalArray, _emberMetalEvents) {
|
7053
6984
|
"use strict";
|
7054
6985
|
|
@@ -7179,6 +7110,75 @@ enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/
|
|
7179
7110
|
return this;
|
7180
7111
|
}
|
7181
7112
|
});
|
7113
|
+
enifed("ember-metal/observer_set", ["exports", "ember-metal/utils", "ember-metal/events"], function (exports, _emberMetalUtils, _emberMetalEvents) {
|
7114
|
+
"use strict";
|
7115
|
+
|
7116
|
+
/*
|
7117
|
+
this.observerSet = {
|
7118
|
+
[senderGuid]: { // variable name: `keySet`
|
7119
|
+
[keyName]: listIndex
|
7120
|
+
}
|
7121
|
+
},
|
7122
|
+
this.observers = [
|
7123
|
+
{
|
7124
|
+
sender: obj,
|
7125
|
+
keyName: keyName,
|
7126
|
+
eventName: eventName,
|
7127
|
+
listeners: [
|
7128
|
+
[target, method, flags]
|
7129
|
+
]
|
7130
|
+
},
|
7131
|
+
...
|
7132
|
+
]
|
7133
|
+
*/
|
7134
|
+
exports["default"] = ObserverSet;
|
7135
|
+
|
7136
|
+
function ObserverSet() {
|
7137
|
+
this.clear();
|
7138
|
+
}
|
7139
|
+
|
7140
|
+
ObserverSet.prototype.add = function (sender, keyName, eventName) {
|
7141
|
+
var observerSet = this.observerSet;
|
7142
|
+
var observers = this.observers;
|
7143
|
+
var senderGuid = _emberMetalUtils.guidFor(sender);
|
7144
|
+
var keySet = observerSet[senderGuid];
|
7145
|
+
var index;
|
7146
|
+
|
7147
|
+
if (!keySet) {
|
7148
|
+
observerSet[senderGuid] = keySet = {};
|
7149
|
+
}
|
7150
|
+
index = keySet[keyName];
|
7151
|
+
if (index === undefined) {
|
7152
|
+
index = observers.push({
|
7153
|
+
sender: sender,
|
7154
|
+
keyName: keyName,
|
7155
|
+
eventName: eventName,
|
7156
|
+
listeners: []
|
7157
|
+
}) - 1;
|
7158
|
+
keySet[keyName] = index;
|
7159
|
+
}
|
7160
|
+
return observers[index].listeners;
|
7161
|
+
};
|
7162
|
+
|
7163
|
+
ObserverSet.prototype.flush = function () {
|
7164
|
+
var observers = this.observers;
|
7165
|
+
var i, len, observer, sender;
|
7166
|
+
this.clear();
|
7167
|
+
for (i = 0, len = observers.length; i < len; ++i) {
|
7168
|
+
observer = observers[i];
|
7169
|
+
sender = observer.sender;
|
7170
|
+
if (sender.isDestroying || sender.isDestroyed) {
|
7171
|
+
continue;
|
7172
|
+
}
|
7173
|
+
_emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
|
7174
|
+
}
|
7175
|
+
};
|
7176
|
+
|
7177
|
+
ObserverSet.prototype.clear = function () {
|
7178
|
+
this.observerSet = {};
|
7179
|
+
this.observers = [];
|
7180
|
+
};
|
7181
|
+
});
|
7182
7182
|
enifed('ember-metal/path_cache', ['exports', 'ember-metal/cache'], function (exports, _emberMetalCache) {
|
7183
7183
|
'use strict';
|
7184
7184
|
|
@@ -12589,6 +12589,41 @@ enifed('ember-template-compiler/system/calculate-location-display', ['exports'],
|
|
12589
12589
|
return moduleInfo;
|
12590
12590
|
}
|
12591
12591
|
});
|
12592
|
+
enifed("ember-template-compiler/system/compile", ["exports", "ember-template-compiler/system/compile_options", "ember-template-compiler/system/template"], function (exports, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
|
12593
|
+
/**
|
12594
|
+
@module ember
|
12595
|
+
@submodule ember-template-compiler
|
12596
|
+
*/
|
12597
|
+
|
12598
|
+
"use strict";
|
12599
|
+
|
12600
|
+
var compile;
|
12601
|
+
|
12602
|
+
/**
|
12603
|
+
Uses HTMLBars `compile` function to process a string into a compiled template.
|
12604
|
+
|
12605
|
+
This is not present in production builds.
|
12606
|
+
|
12607
|
+
@private
|
12608
|
+
@method compile
|
12609
|
+
@param {String} templateString This is the string to be compiled by HTMLBars.
|
12610
|
+
@param {Object} options This is an options hash to augment the compiler options.
|
12611
|
+
*/
|
12612
|
+
|
12613
|
+
exports["default"] = function (templateString, options) {
|
12614
|
+
if (!compile && Ember.__loader.registry['htmlbars-compiler/compiler']) {
|
12615
|
+
compile = requireModule('htmlbars-compiler/compiler').compile;
|
12616
|
+
}
|
12617
|
+
|
12618
|
+
if (!compile) {
|
12619
|
+
throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
|
12620
|
+
}
|
12621
|
+
|
12622
|
+
var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options["default"](options));
|
12623
|
+
|
12624
|
+
return _emberTemplateCompilerSystemTemplate["default"](templateSpec);
|
12625
|
+
};
|
12626
|
+
});
|
12592
12627
|
enifed("ember-template-compiler/system/compile_options", ["exports", "ember-metal/core", "ember-metal/merge", "ember-template-compiler/plugins"], function (exports, _emberMetalCore, _emberMetalMerge, _emberTemplateCompilerPlugins) {
|
12593
12628
|
/**
|
12594
12629
|
@module ember
|
@@ -12628,7 +12663,7 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
|
|
12628
12663
|
|
12629
12664
|
options.buildMeta = function buildMeta(program) {
|
12630
12665
|
return {
|
12631
|
-
revision: 'Ember@1.13.
|
12666
|
+
revision: 'Ember@1.13.13',
|
12632
12667
|
loc: program.loc,
|
12633
12668
|
moduleName: options.moduleName
|
12634
12669
|
};
|
@@ -12637,41 +12672,6 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
|
|
12637
12672
|
return options;
|
12638
12673
|
};
|
12639
12674
|
});
|
12640
|
-
enifed("ember-template-compiler/system/compile", ["exports", "ember-template-compiler/system/compile_options", "ember-template-compiler/system/template"], function (exports, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
|
12641
|
-
/**
|
12642
|
-
@module ember
|
12643
|
-
@submodule ember-template-compiler
|
12644
|
-
*/
|
12645
|
-
|
12646
|
-
"use strict";
|
12647
|
-
|
12648
|
-
var compile;
|
12649
|
-
|
12650
|
-
/**
|
12651
|
-
Uses HTMLBars `compile` function to process a string into a compiled template.
|
12652
|
-
|
12653
|
-
This is not present in production builds.
|
12654
|
-
|
12655
|
-
@private
|
12656
|
-
@method compile
|
12657
|
-
@param {String} templateString This is the string to be compiled by HTMLBars.
|
12658
|
-
@param {Object} options This is an options hash to augment the compiler options.
|
12659
|
-
*/
|
12660
|
-
|
12661
|
-
exports["default"] = function (templateString, options) {
|
12662
|
-
if (!compile && Ember.__loader.registry['htmlbars-compiler/compiler']) {
|
12663
|
-
compile = requireModule('htmlbars-compiler/compiler').compile;
|
12664
|
-
}
|
12665
|
-
|
12666
|
-
if (!compile) {
|
12667
|
-
throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
|
12668
|
-
}
|
12669
|
-
|
12670
|
-
var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options["default"](options));
|
12671
|
-
|
12672
|
-
return _emberTemplateCompilerSystemTemplate["default"](templateSpec);
|
12673
|
-
};
|
12674
|
-
});
|
12675
12675
|
enifed('ember-template-compiler/system/precompile', ['exports', 'ember-template-compiler/system/compile_options'], function (exports, _emberTemplateCompilerSystemCompile_options) {
|
12676
12676
|
/**
|
12677
12677
|
@module ember
|
@@ -14484,7 +14484,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14484
14484
|
return {
|
14485
14485
|
meta: template.meta,
|
14486
14486
|
arity: template.arity,
|
14487
|
-
yield: yieldArgs,
|
14487
|
+
"yield": yieldArgs,
|
14488
14488
|
yieldItem: yieldItem(template, env, scope, morph, renderState, visitor),
|
14489
14489
|
yieldIn: yieldInShadowTemplate(template, env, scope, morph, renderState, visitor),
|
14490
14490
|
raw: template,
|
@@ -14720,7 +14720,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14720
14720
|
function thisFor(options) {
|
14721
14721
|
return {
|
14722
14722
|
arity: options.template.arity,
|
14723
|
-
yield: options.template
|
14723
|
+
"yield": options.template["yield"],
|
14724
14724
|
yieldItem: options.template.yieldItem,
|
14725
14725
|
yieldIn: options.template.yieldIn
|
14726
14726
|
};
|
@@ -15207,7 +15207,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
15207
15207
|
return true;
|
15208
15208
|
},
|
15209
15209
|
|
15210
|
-
yield: function (morph, env, scope, params, hash, template, inverse, visitor) {
|
15210
|
+
"yield": function (morph, env, scope, params, hash, template, inverse, visitor) {
|
15211
15211
|
// the current scope is provided purely for the creation of shadow
|
15212
15212
|
// scopes; it should not be provided to user code.
|
15213
15213
|
|