ember-source 1.13.11 → 1.13.12
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 +1154 -1154
- data/dist/ember-testing.js +1 -1
- data/dist/ember.debug.js +3482 -3482
- data/dist/ember.js +3482 -3482
- data/dist/ember.min.js +13 -12
- data/dist/ember.prod.js +3480 -3480
- 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: 26b5cf01082ab1d8865f82d6d9b57d59ffdc2e8c
|
4
|
+
data.tar.gz: d967409290000c2a95580a088dd61a8e8c12c4e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a32727fa818713c1999e2bcb3fb57b9d7f33aa249aa32a7d3404355776e4259547329e54bb33b010f6149c651c3809f2c4552255b4de5e22d182d3385ea2bd7
|
7
|
+
data.tar.gz: 73d853e03db86d4b88bfb741ea8637224b62974ed78c16aa8dbb8a40304e02c569a01072162b6f3a56b8c5fc976f53dd85a2b9d41ceea79eac6028cfb6c16f51
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.13.
|
1
|
+
1.13.12
|
@@ -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.12
|
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_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) {
|
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
|
+
|
1877
1893
|
/**
|
1878
1894
|
@module ember
|
1879
1895
|
@submodule ember-metal
|
1880
1896
|
*/
|
1881
1897
|
|
1882
|
-
|
1898
|
+
function getProperties(self, propertyNames) {
|
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
|
+
}
|
1883
1905
|
|
1884
|
-
function
|
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
|
+
}
|
1885
1911
|
|
1886
|
-
|
1887
|
-
|
1888
|
-
|
1912
|
+
var computedFunc = _emberMetalComputed.computed(function () {
|
1913
|
+
return macro.apply(this, [getProperties(this, properties)]);
|
1914
|
+
});
|
1915
|
+
|
1916
|
+
return computedFunc.property.apply(computedFunc, properties);
|
1917
|
+
};
|
1918
|
+
}
|
1889
1919
|
|
1890
1920
|
/**
|
1891
|
-
A computed property
|
1892
|
-
|
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.
|
1921
|
+
A computed property that returns true if the value of the dependent
|
1922
|
+
property is null, an empty string, empty array, or empty function.
|
1897
1923
|
|
1898
|
-
|
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.
|
1924
|
+
Example
|
1905
1925
|
|
1906
1926
|
```javascript
|
1907
|
-
var
|
1908
|
-
|
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')
|
1927
|
+
var ToDoList = Ember.Object.extend({
|
1928
|
+
isDone: Ember.computed.empty('todos')
|
1918
1929
|
});
|
1919
1930
|
|
1920
|
-
var
|
1921
|
-
|
1922
|
-
lastName: 'Dale'
|
1931
|
+
var todoList = ToDoList.create({
|
1932
|
+
todos: ['Unit Test', 'Documentation', 'Release']
|
1923
1933
|
});
|
1924
1934
|
|
1925
|
-
|
1935
|
+
todoList.get('isDone'); // false
|
1936
|
+
todoList.get('todos').clear();
|
1937
|
+
todoList.get('isDone'); // true
|
1926
1938
|
```
|
1927
1939
|
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
1931
|
-
|
1932
|
-
|
1933
|
-
|
1934
|
-
|
1935
|
-
|
1936
|
-
|
1937
|
-
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
1947
|
-
// setter
|
1948
|
-
} else {
|
1949
|
-
var name = value.split(' ');
|
1940
|
+
@since 1.6.0
|
1941
|
+
@method empty
|
1942
|
+
@for Ember.computed
|
1943
|
+
@param {String} dependentKey
|
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.
|
1950
1958
|
|
1951
|
-
|
1952
|
-
this.set('lastName', name[1]);
|
1959
|
+
Example
|
1953
1960
|
|
1954
|
-
|
1955
|
-
|
1956
|
-
|
1961
|
+
```javascript
|
1962
|
+
var Hamster = Ember.Object.extend({
|
1963
|
+
hasStuff: Ember.computed.notEmpty('backpack')
|
1957
1964
|
});
|
1958
1965
|
|
1959
|
-
var
|
1966
|
+
var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
|
1960
1967
|
|
1961
|
-
|
1962
|
-
|
1963
|
-
|
1968
|
+
hamster.get('hasStuff'); // true
|
1969
|
+
hamster.get('backpack').clear(); // []
|
1970
|
+
hamster.get('hasStuff'); // false
|
1964
1971
|
```
|
1965
1972
|
|
1966
|
-
@
|
1967
|
-
@
|
1968
|
-
@
|
1973
|
+
@method notEmpty
|
1974
|
+
@for Ember.computed
|
1975
|
+
@param {String} dependentKey
|
1976
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
1977
|
+
original value for property is not empty.
|
1969
1978
|
@public
|
1970
1979
|
*/
|
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
|
-
}
|
1989
|
-
|
1990
|
-
this._dependentKeys = undefined;
|
1991
|
-
this._suspended = undefined;
|
1992
|
-
this._meta = undefined;
|
1993
1980
|
|
1994
|
-
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1998
|
-
this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
|
1981
|
+
function notEmpty(dependentKey) {
|
1982
|
+
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
1983
|
+
return !_emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
1984
|
+
});
|
1999
1985
|
}
|
2000
1986
|
|
2001
|
-
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
2002
|
-
|
2003
|
-
var ComputedPropertyPrototype = ComputedProperty.prototype;
|
2004
|
-
|
2005
1987
|
/**
|
2006
|
-
|
2007
|
-
|
1988
|
+
A computed property that returns true if the value of the dependent
|
1989
|
+
property is null or undefined. This avoids errors from JSLint complaining
|
1990
|
+
about use of ==, which can be technically confusing.
|
2008
1991
|
|
2009
|
-
|
2010
|
-
the computed property will not automatically cache the return value.
|
1992
|
+
Example
|
2011
1993
|
|
2012
|
-
|
2013
|
-
|
1994
|
+
```javascript
|
1995
|
+
var Hamster = Ember.Object.extend({
|
1996
|
+
isHungry: Ember.computed.none('food')
|
1997
|
+
});
|
2014
1998
|
|
2015
|
-
|
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.
|
1999
|
+
var hamster = Hamster.create();
|
2031
2000
|
|
2032
|
-
|
2033
|
-
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
2037
|
-
}).create();
|
2001
|
+
hamster.get('isHungry'); // true
|
2002
|
+
hamster.set('food', 'Banana');
|
2003
|
+
hamster.get('isHungry'); // false
|
2004
|
+
hamster.set('food', null);
|
2005
|
+
hamster.get('isHungry'); // true
|
2038
2006
|
```
|
2039
2007
|
|
2040
|
-
@method
|
2041
|
-
@
|
2042
|
-
@
|
2008
|
+
@method none
|
2009
|
+
@for Ember.computed
|
2010
|
+
@param {String} dependentKey
|
2011
|
+
@return {Ember.ComputedProperty} computed property which
|
2012
|
+
returns true if original value for property is null or undefined.
|
2043
2013
|
@public
|
2044
2014
|
*/
|
2045
|
-
|
2046
|
-
|
2047
|
-
return
|
2048
|
-
|
2015
|
+
|
2016
|
+
function none(dependentKey) {
|
2017
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2018
|
+
return _emberMetalIs_none["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2019
|
+
});
|
2020
|
+
}
|
2049
2021
|
|
2050
2022
|
/**
|
2051
|
-
|
2052
|
-
|
2023
|
+
A computed property that returns the inverse boolean value
|
2024
|
+
of the original value for the dependent property.
|
2025
|
+
|
2026
|
+
Example
|
2053
2027
|
|
2054
2028
|
```javascript
|
2055
|
-
var
|
2056
|
-
|
2057
|
-
return 'guid-guid-guid';
|
2058
|
-
}.property().readOnly()
|
2029
|
+
var User = Ember.Object.extend({
|
2030
|
+
isAnonymous: Ember.computed.not('loggedIn')
|
2059
2031
|
});
|
2060
2032
|
|
2061
|
-
var
|
2033
|
+
var user = User.create({loggedIn: false});
|
2062
2034
|
|
2063
|
-
|
2064
|
-
|
2035
|
+
user.get('isAnonymous'); // true
|
2036
|
+
user.set('loggedIn', true);
|
2037
|
+
user.get('isAnonymous'); // false
|
2038
|
+
```
|
2065
2039
|
|
2066
|
-
@method
|
2067
|
-
@
|
2068
|
-
@
|
2040
|
+
@method not
|
2041
|
+
@for Ember.computed
|
2042
|
+
@param {String} dependentKey
|
2043
|
+
@return {Ember.ComputedProperty} computed property which returns
|
2044
|
+
inverse of the original value for property
|
2069
2045
|
@public
|
2070
2046
|
*/
|
2071
|
-
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2076
|
-
}
|
2047
|
+
|
2048
|
+
function not(dependentKey) {
|
2049
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2050
|
+
return !_emberMetalProperty_get.get(this, dependentKey);
|
2051
|
+
});
|
2052
|
+
}
|
2077
2053
|
|
2078
2054
|
/**
|
2079
|
-
|
2080
|
-
|
2055
|
+
A computed property that converts the provided dependent property
|
2056
|
+
into a boolean value.
|
2081
2057
|
|
2082
2058
|
```javascript
|
2083
|
-
var
|
2084
|
-
|
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')
|
2059
|
+
var Hamster = Ember.Object.extend({
|
2060
|
+
hasBananas: Ember.computed.bool('numBananas')
|
2090
2061
|
});
|
2091
2062
|
|
2092
|
-
var
|
2093
|
-
firstName: 'Barack',
|
2094
|
-
lastName: 'Obama'
|
2095
|
-
});
|
2063
|
+
var hamster = Hamster.create();
|
2096
2064
|
|
2097
|
-
|
2065
|
+
hamster.get('hasBananas'); // false
|
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
|
2098
2072
|
```
|
2099
2073
|
|
2100
|
-
@method
|
2101
|
-
@
|
2102
|
-
@
|
2103
|
-
@
|
2074
|
+
@method bool
|
2075
|
+
@for Ember.computed
|
2076
|
+
@param {String} dependentKey
|
2077
|
+
@return {Ember.ComputedProperty} computed property which converts
|
2078
|
+
to boolean the original value for property
|
2104
2079
|
@public
|
2105
2080
|
*/
|
2106
|
-
ComputedPropertyPrototype.property = function () {
|
2107
|
-
var args;
|
2108
|
-
|
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
2081
|
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
2116
|
-
|
2117
|
-
_emberMetalExpand_properties["default"](arguments[i], addArg);
|
2118
|
-
}
|
2119
|
-
|
2120
|
-
this._dependentKeys = args;
|
2121
|
-
return this;
|
2122
|
-
};
|
2082
|
+
function bool(dependentKey) {
|
2083
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2084
|
+
return !!_emberMetalProperty_get.get(this, dependentKey);
|
2085
|
+
});
|
2086
|
+
}
|
2123
2087
|
|
2124
2088
|
/**
|
2125
|
-
|
2126
|
-
|
2127
|
-
|
2128
|
-
available for introspection.
|
2089
|
+
A computed property which matches the original value for the
|
2090
|
+
dependent property against a given RegExp, returning `true`
|
2091
|
+
if they values matches the RegExp and `false` if it does not.
|
2129
2092
|
|
2130
|
-
|
2093
|
+
Example
|
2131
2094
|
|
2132
|
-
```
|
2133
|
-
|
2134
|
-
|
2135
|
-
|
2136
|
-
}.property().meta({ type: App.Person })
|
2137
|
-
```
|
2095
|
+
```javascript
|
2096
|
+
var User = Ember.Object.extend({
|
2097
|
+
hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
|
2098
|
+
});
|
2138
2099
|
|
2139
|
-
|
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.
|
2100
|
+
var user = User.create({loggedIn: false});
|
2143
2101
|
|
2144
|
-
|
2145
|
-
|
2146
|
-
|
2102
|
+
user.get('hasValidEmail'); // false
|
2103
|
+
user.set('email', '');
|
2104
|
+
user.get('hasValidEmail'); // false
|
2105
|
+
user.set('email', 'ember_hamster@example.com');
|
2106
|
+
user.get('hasValidEmail'); // true
|
2107
|
+
```
|
2108
|
+
|
2109
|
+
@method match
|
2110
|
+
@for Ember.computed
|
2111
|
+
@param {String} dependentKey
|
2112
|
+
@param {RegExp} regexp
|
2113
|
+
@return {Ember.ComputedProperty} computed property which match
|
2114
|
+
the original value for property against a given RegExp
|
2147
2115
|
@public
|
2148
2116
|
*/
|
2149
2117
|
|
2150
|
-
|
2151
|
-
|
2152
|
-
|
2153
|
-
} else {
|
2154
|
-
this._meta = meta;
|
2155
|
-
return this;
|
2156
|
-
}
|
2157
|
-
};
|
2158
|
-
|
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
|
-
};
|
2118
|
+
function match(dependentKey, regexp) {
|
2119
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2120
|
+
var value = _emberMetalProperty_get.get(this, dependentKey);
|
2171
2121
|
|
2172
|
-
|
2173
|
-
|
2174
|
-
chainNodes[i].didChange(null);
|
2175
|
-
}
|
2122
|
+
return typeof value === 'string' ? regexp.test(value) : false;
|
2123
|
+
});
|
2176
2124
|
}
|
2177
2125
|
|
2178
2126
|
/**
|
2179
|
-
|
2180
|
-
|
2181
|
-
|
2127
|
+
A computed property that returns true if the provided dependent property
|
2128
|
+
is equal to the given value.
|
2129
|
+
|
2130
|
+
Example
|
2182
2131
|
|
2183
2132
|
```javascript
|
2184
|
-
var
|
2185
|
-
|
2186
|
-
// the keyName parameter is 'fullName' in this case.
|
2187
|
-
return this.get('firstName') + ' ' + this.get('lastName');
|
2188
|
-
}.property('firstName', 'lastName')
|
2133
|
+
var Hamster = Ember.Object.extend({
|
2134
|
+
napTime: Ember.computed.equal('state', 'sleepy')
|
2189
2135
|
});
|
2190
2136
|
|
2137
|
+
var hamster = Hamster.create();
|
2191
2138
|
|
2192
|
-
|
2193
|
-
|
2194
|
-
|
2195
|
-
|
2196
|
-
|
2197
|
-
tom.get('fullName') // 'Tom Dale'
|
2139
|
+
hamster.get('napTime'); // false
|
2140
|
+
hamster.set('state', 'sleepy');
|
2141
|
+
hamster.get('napTime'); // true
|
2142
|
+
hamster.set('state', 'hungry');
|
2143
|
+
hamster.get('napTime'); // false
|
2198
2144
|
```
|
2199
2145
|
|
2200
|
-
@method
|
2201
|
-
@
|
2202
|
-
@
|
2146
|
+
@method equal
|
2147
|
+
@for Ember.computed
|
2148
|
+
@param {String} dependentKey
|
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.
|
2203
2152
|
@public
|
2204
2153
|
*/
|
2205
|
-
ComputedPropertyPrototype.get = function (obj, keyName) {
|
2206
|
-
var ret, cache, meta, chainNodes;
|
2207
|
-
if (this._cacheable) {
|
2208
|
-
meta = metaFor(obj);
|
2209
|
-
cache = meta.cache;
|
2210
|
-
|
2211
|
-
var result = cache && cache[keyName];
|
2212
2154
|
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
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
|
-
};
|
2155
|
+
function equal(dependentKey, value) {
|
2156
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2157
|
+
return _emberMetalProperty_get.get(this, dependentKey) === value;
|
2158
|
+
});
|
2159
|
+
}
|
2240
2160
|
|
2241
2161
|
/**
|
2242
|
-
|
2243
|
-
|
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.
|
2162
|
+
A computed property that returns true if the provided dependent property
|
2163
|
+
is greater than the provided value.
|
2246
2164
|
|
2247
|
-
|
2248
|
-
your backing function should accept either two or three arguments.
|
2165
|
+
Example
|
2249
2166
|
|
2250
2167
|
```javascript
|
2251
|
-
var
|
2252
|
-
|
2253
|
-
|
2254
|
-
lastName: null,
|
2168
|
+
var Hamster = Ember.Object.extend({
|
2169
|
+
hasTooManyBananas: Ember.computed.gt('numBananas', 10)
|
2170
|
+
});
|
2255
2171
|
|
2256
|
-
|
2257
|
-
// getter
|
2258
|
-
if (arguments.length === 1) {
|
2259
|
-
var firstName = this.get('firstName');
|
2260
|
-
var lastName = this.get('lastName');
|
2172
|
+
var hamster = Hamster.create();
|
2261
2173
|
|
2262
|
-
|
2174
|
+
hamster.get('hasTooManyBananas'); // false
|
2175
|
+
hamster.set('numBananas', 3);
|
2176
|
+
hamster.get('hasTooManyBananas'); // false
|
2177
|
+
hamster.set('numBananas', 11);
|
2178
|
+
hamster.get('hasTooManyBananas'); // true
|
2179
|
+
```
|
2263
2180
|
|
2264
|
-
|
2265
|
-
|
2266
|
-
|
2181
|
+
@method gt
|
2182
|
+
@for Ember.computed
|
2183
|
+
@param {String} dependentKey
|
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.
|
2267
2199
|
|
2268
|
-
|
2269
|
-
this.set('lastName', name[1]);
|
2200
|
+
Example
|
2270
2201
|
|
2271
|
-
|
2272
|
-
|
2273
|
-
|
2202
|
+
```javascript
|
2203
|
+
var Hamster = Ember.Object.extend({
|
2204
|
+
hasTooManyBananas: Ember.computed.gte('numBananas', 10)
|
2274
2205
|
});
|
2275
2206
|
|
2276
|
-
var
|
2207
|
+
var hamster = Hamster.create();
|
2277
2208
|
|
2278
|
-
|
2279
|
-
|
2280
|
-
|
2209
|
+
hamster.get('hasTooManyBananas'); // false
|
2210
|
+
hamster.set('numBananas', 3);
|
2211
|
+
hamster.get('hasTooManyBananas'); // false
|
2212
|
+
hamster.set('numBananas', 10);
|
2213
|
+
hamster.get('hasTooManyBananas'); // true
|
2281
2214
|
```
|
2282
2215
|
|
2283
|
-
@method
|
2284
|
-
@
|
2285
|
-
@param {
|
2286
|
-
@param {
|
2287
|
-
@return {
|
2216
|
+
@method gte
|
2217
|
+
@for Ember.computed
|
2218
|
+
@param {String} dependentKey
|
2219
|
+
@param {Number} value
|
2220
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2221
|
+
the original value for property is greater or equal then given value.
|
2288
2222
|
@public
|
2289
2223
|
*/
|
2290
|
-
ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
|
2291
|
-
var oldSuspended = this._suspended;
|
2292
|
-
|
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
2224
|
|
2369
|
-
|
2370
|
-
|
2371
|
-
|
2372
|
-
|
2373
|
-
|
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
|
-
};
|
2225
|
+
function gte(dependentKey, value) {
|
2226
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2227
|
+
return _emberMetalProperty_get.get(this, dependentKey) >= value;
|
2228
|
+
});
|
2229
|
+
}
|
2385
2230
|
|
2386
2231
|
/**
|
2387
|
-
|
2388
|
-
|
2389
|
-
with mixins or via `Ember.defineProperty()`.
|
2390
|
-
|
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.
|
2395
|
-
|
2396
|
-
A computed property defined in this way might look like this:
|
2232
|
+
A computed property that returns true if the provided dependent property
|
2233
|
+
is less than the provided value.
|
2397
2234
|
|
2398
|
-
|
2399
|
-
var Person = Ember.Object.extend({
|
2400
|
-
firstName: 'Betty',
|
2401
|
-
lastName: 'Jones',
|
2235
|
+
Example
|
2402
2236
|
|
2403
|
-
|
2404
|
-
|
2405
|
-
|
2237
|
+
```javascript
|
2238
|
+
var Hamster = Ember.Object.extend({
|
2239
|
+
needsMoreBananas: Ember.computed.lt('numBananas', 3)
|
2406
2240
|
});
|
2407
2241
|
|
2408
|
-
var
|
2409
|
-
|
2410
|
-
client.get('fullName'); // 'Betty Jones'
|
2242
|
+
var hamster = Hamster.create();
|
2411
2243
|
|
2412
|
-
|
2413
|
-
|
2244
|
+
hamster.get('needsMoreBananas'); // true
|
2245
|
+
hamster.set('numBananas', 3);
|
2246
|
+
hamster.get('needsMoreBananas'); // false
|
2247
|
+
hamster.set('numBananas', 2);
|
2248
|
+
hamster.get('needsMoreBananas'); // true
|
2414
2249
|
```
|
2415
2250
|
|
2416
|
-
|
2417
|
-
|
2418
|
-
|
2251
|
+
@method lt
|
2252
|
+
@for Ember.computed
|
2253
|
+
@param {String} dependentKey
|
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;
|
2263
|
+
});
|
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.
|
2419
2269
|
|
2420
|
-
|
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):
|
2270
|
+
Example
|
2424
2271
|
|
2425
|
-
```
|
2426
|
-
|
2427
|
-
|
2428
|
-
}
|
2272
|
+
```javascript
|
2273
|
+
var Hamster = Ember.Object.extend({
|
2274
|
+
needsMoreBananas: Ember.computed.lte('numBananas', 3)
|
2275
|
+
});
|
2276
|
+
|
2277
|
+
var hamster = Hamster.create();
|
2278
|
+
|
2279
|
+
hamster.get('needsMoreBananas'); // true
|
2280
|
+
hamster.set('numBananas', 5);
|
2281
|
+
hamster.get('needsMoreBananas'); // false
|
2282
|
+
hamster.set('numBananas', 3);
|
2283
|
+
hamster.get('needsMoreBananas'); // true
|
2429
2284
|
```
|
2430
2285
|
|
2431
|
-
@
|
2432
|
-
@
|
2433
|
-
@
|
2434
|
-
@
|
2435
|
-
@
|
2436
|
-
|
2437
|
-
@return {Ember.ComputedProperty} property descriptor instance
|
2286
|
+
@method lte
|
2287
|
+
@for Ember.computed
|
2288
|
+
@param {String} dependentKey
|
2289
|
+
@param {Number} value
|
2290
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
2291
|
+
the original value for property is less or equal than given value.
|
2438
2292
|
@public
|
2439
2293
|
*/
|
2440
|
-
function computed(func) {
|
2441
|
-
var args;
|
2442
|
-
|
2443
|
-
if (arguments.length > 1) {
|
2444
|
-
args = [].slice.call(arguments);
|
2445
|
-
func = args.pop();
|
2446
|
-
}
|
2447
2294
|
|
2448
|
-
|
2449
|
-
|
2450
|
-
|
2451
|
-
|
2452
|
-
}
|
2453
|
-
|
2454
|
-
return cp;
|
2295
|
+
function lte(dependentKey, value) {
|
2296
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
2297
|
+
return _emberMetalProperty_get.get(this, dependentKey) <= value;
|
2298
|
+
});
|
2455
2299
|
}
|
2456
2300
|
|
2457
2301
|
/**
|
2458
|
-
|
2459
|
-
|
2460
|
-
property that is generated lazily, without accidentally causing
|
2461
|
-
it to be created.
|
2302
|
+
A computed property that performs a logical `and` on the
|
2303
|
+
original values for the provided dependent properties.
|
2462
2304
|
|
2463
|
-
|
2464
|
-
|
2465
|
-
|
2466
|
-
|
2467
|
-
|
2468
|
-
|
2305
|
+
Example
|
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
|
+
```
|
2322
|
+
|
2323
|
+
@method and
|
2324
|
+
@for Ember.computed
|
2325
|
+
@param {String} dependentKey*
|
2326
|
+
@return {Ember.ComputedProperty} computed property which performs
|
2327
|
+
a logical `and` on the values of all the original values for properties.
|
2469
2328
|
@public
|
2470
2329
|
*/
|
2471
|
-
function
|
2472
|
-
var
|
2473
|
-
var
|
2474
|
-
|
2475
|
-
|
2476
|
-
|
2477
|
-
|
2478
|
-
}
|
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;
|
2330
|
+
var and = generateComputedWithProperties(function (properties) {
|
2331
|
+
var value;
|
2332
|
+
for (var key in properties) {
|
2333
|
+
value = properties[key];
|
2334
|
+
if (properties.hasOwnProperty(key) && !value) {
|
2335
|
+
return false;
|
2336
|
+
}
|
2494
2337
|
}
|
2495
|
-
return
|
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;
|
2338
|
+
return value;
|
2339
|
+
});
|
2524
2340
|
|
2341
|
+
exports.and = and;
|
2525
2342
|
/**
|
2526
|
-
|
2527
|
-
|
2343
|
+
A computed property which performs a logical `or` on the
|
2344
|
+
original values for the provided dependent properties.
|
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
|
2528
2368
|
*/
|
2529
|
-
|
2530
|
-
|
2531
|
-
|
2532
|
-
|
2533
|
-
ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
|
2534
|
-
}
|
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];
|
2369
|
+
var or = generateComputedWithProperties(function (properties) {
|
2370
|
+
for (var key in properties) {
|
2371
|
+
if (properties.hasOwnProperty(key) && properties[key]) {
|
2372
|
+
return properties[key];
|
2542
2373
|
}
|
2374
|
+
}
|
2375
|
+
return false;
|
2376
|
+
});
|
2543
2377
|
|
2544
|
-
|
2545
|
-
return macro.apply(this, [getProperties(this, properties)]);
|
2546
|
-
});
|
2547
|
-
|
2548
|
-
return computedFunc.property.apply(computedFunc, properties);
|
2549
|
-
};
|
2550
|
-
}
|
2551
|
-
|
2378
|
+
exports.or = or;
|
2552
2379
|
/**
|
2553
|
-
A computed property that returns
|
2554
|
-
|
2380
|
+
A computed property that returns the first truthy value
|
2381
|
+
from a list of dependent properties.
|
2555
2382
|
|
2556
2383
|
Example
|
2557
2384
|
|
2558
2385
|
```javascript
|
2559
|
-
var
|
2560
|
-
|
2386
|
+
var Hamster = Ember.Object.extend({
|
2387
|
+
hasClothes: Ember.computed.any('hat', 'shirt')
|
2561
2388
|
});
|
2562
2389
|
|
2563
|
-
var
|
2564
|
-
todos: ['Unit Test', 'Documentation', 'Release']
|
2565
|
-
});
|
2390
|
+
var hamster = Hamster.create();
|
2566
2391
|
|
2567
|
-
|
2568
|
-
|
2569
|
-
|
2392
|
+
hamster.get('hasClothes'); // null
|
2393
|
+
hamster.set('shirt', 'Hawaiian Shirt');
|
2394
|
+
hamster.get('hasClothes'); // 'Hawaiian Shirt'
|
2570
2395
|
```
|
2571
2396
|
|
2572
|
-
@
|
2573
|
-
@method empty
|
2397
|
+
@method any
|
2574
2398
|
@for Ember.computed
|
2575
|
-
@param {String} dependentKey
|
2576
|
-
@return {Ember.ComputedProperty} computed property which
|
2577
|
-
the
|
2399
|
+
@param {String} dependentKey*
|
2400
|
+
@return {Ember.ComputedProperty} computed property which returns
|
2401
|
+
the first truthy value of given list of properties.
|
2402
|
+
@deprecated Use `Ember.computed.or` instead.
|
2578
2403
|
@public
|
2579
2404
|
*/
|
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
|
+
});
|
2580
2414
|
|
2581
|
-
|
2582
|
-
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
2583
|
-
return _emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2584
|
-
});
|
2585
|
-
}
|
2586
|
-
|
2415
|
+
exports.any = any;
|
2587
2416
|
/**
|
2588
|
-
A computed property that returns
|
2589
|
-
|
2417
|
+
A computed property that returns the array of values
|
2418
|
+
for the provided dependent properties.
|
2590
2419
|
|
2591
2420
|
Example
|
2592
2421
|
|
2593
2422
|
```javascript
|
2594
2423
|
var Hamster = Ember.Object.extend({
|
2595
|
-
|
2424
|
+
clothes: Ember.computed.collect('hat', 'shirt')
|
2596
2425
|
});
|
2597
2426
|
|
2598
|
-
var hamster = Hamster.create(
|
2427
|
+
var hamster = Hamster.create();
|
2599
2428
|
|
2600
|
-
hamster.get('
|
2601
|
-
hamster.
|
2602
|
-
hamster.
|
2429
|
+
hamster.get('clothes'); // [null, null]
|
2430
|
+
hamster.set('hat', 'Camp Hat');
|
2431
|
+
hamster.set('shirt', 'Camp Shirt');
|
2432
|
+
hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
|
2603
2433
|
```
|
2604
2434
|
|
2605
|
-
@method
|
2435
|
+
@method collect
|
2606
2436
|
@for Ember.computed
|
2607
|
-
@param {String} dependentKey
|
2608
|
-
@return {Ember.ComputedProperty} computed property which
|
2609
|
-
|
2437
|
+
@param {String} dependentKey*
|
2438
|
+
@return {Ember.ComputedProperty} computed property which maps
|
2439
|
+
values of all passed in properties to an array.
|
2610
2440
|
@public
|
2611
2441
|
*/
|
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
|
+
});
|
2612
2455
|
|
2613
|
-
|
2614
|
-
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
2615
|
-
return !_emberMetalIs_empty["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2616
|
-
});
|
2617
|
-
}
|
2618
|
-
|
2456
|
+
exports.collect = collect;
|
2619
2457
|
/**
|
2620
|
-
|
2621
|
-
|
2622
|
-
|
2623
|
-
|
2624
|
-
Example
|
2458
|
+
Creates a new property that is an alias for another property
|
2459
|
+
on an object. Calls to `get` or `set` this property behave as
|
2460
|
+
though they were called on the original property.
|
2625
2461
|
|
2626
2462
|
```javascript
|
2627
|
-
var
|
2628
|
-
|
2463
|
+
var Person = Ember.Object.extend({
|
2464
|
+
name: 'Alex Matchneer',
|
2465
|
+
nomen: Ember.computed.alias('name')
|
2629
2466
|
});
|
2630
2467
|
|
2631
|
-
var
|
2468
|
+
var alex = Person.create();
|
2632
2469
|
|
2633
|
-
|
2634
|
-
|
2635
|
-
|
2636
|
-
|
2637
|
-
|
2470
|
+
alex.get('nomen'); // 'Alex Matchneer'
|
2471
|
+
alex.get('name'); // 'Alex Matchneer'
|
2472
|
+
|
2473
|
+
alex.set('nomen', '@machty');
|
2474
|
+
alex.get('name'); // '@machty'
|
2638
2475
|
```
|
2639
2476
|
|
2640
|
-
@method
|
2477
|
+
@method alias
|
2641
2478
|
@for Ember.computed
|
2642
2479
|
@param {String} dependentKey
|
2643
|
-
@return {Ember.ComputedProperty} computed property which
|
2644
|
-
|
2480
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
2481
|
+
alias to the original value for property.
|
2645
2482
|
@public
|
2646
2483
|
*/
|
2647
2484
|
|
2648
|
-
function none(dependentKey) {
|
2649
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
2650
|
-
return _emberMetalIs_none["default"](_emberMetalProperty_get.get(this, dependentKey));
|
2651
|
-
});
|
2652
|
-
}
|
2653
|
-
|
2654
2485
|
/**
|
2655
|
-
|
2656
|
-
|
2486
|
+
Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
|
2487
|
+
data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
|
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.
|
2657
2491
|
|
2658
2492
|
Example
|
2659
2493
|
|
2660
2494
|
```javascript
|
2661
2495
|
var User = Ember.Object.extend({
|
2662
|
-
|
2496
|
+
firstName: null,
|
2497
|
+
lastName: null,
|
2498
|
+
nickName: Ember.computed.oneWay('firstName')
|
2663
2499
|
});
|
2664
2500
|
|
2665
|
-
var
|
2501
|
+
var teddy = User.create({
|
2502
|
+
firstName: 'Teddy',
|
2503
|
+
lastName: 'Zeenny'
|
2504
|
+
});
|
2666
2505
|
|
2667
|
-
|
2668
|
-
|
2669
|
-
|
2506
|
+
teddy.get('nickName'); // 'Teddy'
|
2507
|
+
teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
|
2508
|
+
teddy.get('firstName'); // 'Teddy'
|
2670
2509
|
```
|
2671
2510
|
|
2672
|
-
@method
|
2511
|
+
@method oneWay
|
2673
2512
|
@for Ember.computed
|
2674
2513
|
@param {String} dependentKey
|
2675
|
-
@return {Ember.ComputedProperty} computed property which
|
2676
|
-
|
2514
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
2515
|
+
one way computed property to the original value for property.
|
2677
2516
|
@public
|
2678
2517
|
*/
|
2679
2518
|
|
2680
|
-
function
|
2681
|
-
return
|
2682
|
-
return !_emberMetalProperty_get.get(this, dependentKey);
|
2683
|
-
});
|
2519
|
+
function oneWay(dependentKey) {
|
2520
|
+
return _emberMetalAlias["default"](dependentKey).oneWay();
|
2684
2521
|
}
|
2685
2522
|
|
2686
2523
|
/**
|
2687
|
-
|
2688
|
-
|
2689
|
-
|
2690
|
-
```javascript
|
2691
|
-
var Hamster = Ember.Object.extend({
|
2692
|
-
hasBananas: Ember.computed.bool('numBananas')
|
2693
|
-
});
|
2694
|
-
|
2695
|
-
var hamster = Hamster.create();
|
2696
|
-
|
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
|
2704
|
-
```
|
2524
|
+
This is a more semantically meaningful alias of `computed.oneWay`,
|
2525
|
+
whose name is somewhat ambiguous as to which direction the data flows.
|
2705
2526
|
|
2706
|
-
@method
|
2527
|
+
@method reads
|
2707
2528
|
@for Ember.computed
|
2708
2529
|
@param {String} dependentKey
|
2709
|
-
@return {Ember.ComputedProperty} computed property which
|
2710
|
-
|
2530
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
2531
|
+
one way computed property to the original value for property.
|
2711
2532
|
@public
|
2712
|
-
|
2713
|
-
|
2714
|
-
function bool(dependentKey) {
|
2715
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
2716
|
-
return !!_emberMetalProperty_get.get(this, dependentKey);
|
2717
|
-
});
|
2718
|
-
}
|
2533
|
+
*/
|
2719
2534
|
|
2720
2535
|
/**
|
2721
|
-
|
2722
|
-
|
2723
|
-
|
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.
|
2724
2541
|
|
2725
2542
|
Example
|
2726
2543
|
|
2727
2544
|
```javascript
|
2728
2545
|
var User = Ember.Object.extend({
|
2729
|
-
|
2546
|
+
firstName: null,
|
2547
|
+
lastName: null,
|
2548
|
+
nickName: Ember.computed.readOnly('firstName')
|
2730
2549
|
});
|
2731
2550
|
|
2732
|
-
var
|
2551
|
+
var teddy = User.create({
|
2552
|
+
firstName: 'Teddy',
|
2553
|
+
lastName: 'Zeenny'
|
2554
|
+
});
|
2733
2555
|
|
2734
|
-
|
2735
|
-
|
2736
|
-
|
2737
|
-
|
2738
|
-
user.get('hasValidEmail'); // true
|
2556
|
+
teddy.get('nickName'); // 'Teddy'
|
2557
|
+
teddy.set('nickName', 'TeddyBear'); // throws Exception
|
2558
|
+
// throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
|
2559
|
+
teddy.get('firstName'); // 'Teddy'
|
2739
2560
|
```
|
2740
2561
|
|
2741
|
-
@method
|
2562
|
+
@method readOnly
|
2742
2563
|
@for Ember.computed
|
2743
2564
|
@param {String} dependentKey
|
2744
|
-
@
|
2745
|
-
|
2746
|
-
|
2565
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
2566
|
+
one way computed property to the original value for property.
|
2567
|
+
@since 1.5.0
|
2747
2568
|
@public
|
2748
2569
|
*/
|
2749
2570
|
|
2750
|
-
function
|
2751
|
-
return
|
2752
|
-
var value = _emberMetalProperty_get.get(this, dependentKey);
|
2753
|
-
|
2754
|
-
return typeof value === 'string' ? regexp.test(value) : false;
|
2755
|
-
});
|
2571
|
+
function readOnly(dependentKey) {
|
2572
|
+
return _emberMetalAlias["default"](dependentKey).readOnly();
|
2756
2573
|
}
|
2757
2574
|
|
2758
2575
|
/**
|
2759
|
-
A computed property that
|
2760
|
-
|
2576
|
+
A computed property that acts like a standard getter and setter,
|
2577
|
+
but returns the value at the provided `defaultPath` if the
|
2578
|
+
property itself has not been set to a value
|
2761
2579
|
|
2762
2580
|
Example
|
2763
2581
|
|
2764
2582
|
```javascript
|
2765
2583
|
var Hamster = Ember.Object.extend({
|
2766
|
-
|
2584
|
+
wishList: Ember.computed.defaultTo('favoriteFood')
|
2767
2585
|
});
|
2768
2586
|
|
2769
|
-
var hamster = Hamster.create();
|
2587
|
+
var hamster = Hamster.create({ favoriteFood: 'Banana' });
|
2770
2588
|
|
2771
|
-
hamster.get('
|
2772
|
-
hamster.set('
|
2773
|
-
hamster.get('
|
2774
|
-
hamster.
|
2775
|
-
hamster.get('napTime'); // false
|
2589
|
+
hamster.get('wishList'); // 'Banana'
|
2590
|
+
hamster.set('wishList', 'More Unit Tests');
|
2591
|
+
hamster.get('wishList'); // 'More Unit Tests'
|
2592
|
+
hamster.get('favoriteFood'); // 'Banana'
|
2776
2593
|
```
|
2777
2594
|
|
2778
|
-
@method
|
2595
|
+
@method defaultTo
|
2596
|
+
@for Ember.computed
|
2597
|
+
@param {String} defaultPath
|
2598
|
+
@return {Ember.ComputedProperty} computed property which acts like
|
2599
|
+
a standard getter and setter, but defaults to the value from `defaultPath`.
|
2600
|
+
@deprecated Use `Ember.computed.oneWay` or custom CP with default instead.
|
2601
|
+
@public
|
2602
|
+
*/
|
2603
|
+
|
2604
|
+
function defaultTo(defaultPath) {
|
2605
|
+
return _emberMetalComputed.computed({
|
2606
|
+
get: function (key) {
|
2607
|
+
_emberMetalCore["default"].deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.');
|
2608
|
+
return _emberMetalProperty_get.get(this, defaultPath);
|
2609
|
+
},
|
2610
|
+
|
2611
|
+
set: function (key, newValue, cachedValue) {
|
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
|
+
}
|
2615
|
+
});
|
2616
|
+
}
|
2617
|
+
|
2618
|
+
/**
|
2619
|
+
Creates a new property that is an alias for another property
|
2620
|
+
on an object. Calls to `get` or `set` this property behave as
|
2621
|
+
though they were called on the original property, but also
|
2622
|
+
print a deprecation warning.
|
2623
|
+
|
2624
|
+
@method deprecatingAlias
|
2779
2625
|
@for Ember.computed
|
2780
2626
|
@param {String} dependentKey
|
2781
|
-
@
|
2782
|
-
|
2783
|
-
|
2627
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
2628
|
+
alias with a deprecation to the original value for property.
|
2629
|
+
@since 1.7.0
|
2784
2630
|
@public
|
2785
2631
|
*/
|
2786
2632
|
|
2787
|
-
function
|
2788
|
-
return _emberMetalComputed.computed(dependentKey,
|
2789
|
-
|
2633
|
+
function deprecatingAlias(dependentKey) {
|
2634
|
+
return _emberMetalComputed.computed(dependentKey, {
|
2635
|
+
get: function (key) {
|
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
|
+
}
|
2790
2644
|
});
|
2791
2645
|
}
|
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";
|
2792
2649
|
|
2793
2650
|
/**
|
2794
|
-
|
2795
|
-
|
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
|
+
|
2663
|
+
/**
|
2664
|
+
A computed property transforms an object's function into a property.
|
2796
2665
|
|
2797
|
-
|
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.
|
2798
2678
|
|
2799
2679
|
```javascript
|
2800
|
-
var
|
2801
|
-
|
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');
|
2688
|
+
|
2689
|
+
return firstName + ' ' + lastName;
|
2690
|
+
}.property('firstName', 'lastName')
|
2691
|
+
});
|
2692
|
+
|
2693
|
+
var tom = Person.create({
|
2694
|
+
firstName: 'Tom',
|
2695
|
+
lastName: 'Dale'
|
2802
2696
|
});
|
2803
2697
|
|
2804
|
-
|
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
|
2698
|
+
tom.get('fullName') // 'Tom Dale'
|
2811
2699
|
```
|
2812
2700
|
|
2813
|
-
|
2814
|
-
|
2815
|
-
|
2816
|
-
|
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
|
2701
|
+
You can also define what Ember should do when setting a computed property.
|
2702
|
+
If you try to set a computed property, it will be invoked with the key and
|
2703
|
+
value you want to set it to. You can also accept the previous value as the
|
2704
|
+
third parameter.
|
2833
2705
|
|
2834
2706
|
```javascript
|
2835
|
-
var
|
2836
|
-
|
2837
|
-
|
2707
|
+
var Person = Ember.Object.extend({
|
2708
|
+
// these will be supplied by `create`
|
2709
|
+
firstName: null,
|
2710
|
+
lastName: null,
|
2838
2711
|
|
2839
|
-
|
2712
|
+
fullName: function(key, value, oldValue) {
|
2713
|
+
// getter
|
2714
|
+
if (arguments.length === 1) {
|
2715
|
+
var firstName = this.get('firstName');
|
2716
|
+
var lastName = this.get('lastName');
|
2840
2717
|
|
2841
|
-
|
2842
|
-
hamster.set('numBananas', 3);
|
2843
|
-
hamster.get('hasTooManyBananas'); // false
|
2844
|
-
hamster.set('numBananas', 10);
|
2845
|
-
hamster.get('hasTooManyBananas'); // true
|
2846
|
-
```
|
2718
|
+
return firstName + ' ' + lastName;
|
2847
2719
|
|
2848
|
-
|
2849
|
-
|
2850
|
-
|
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.
|
2720
|
+
// setter
|
2721
|
+
} else {
|
2722
|
+
var name = value.split(' ');
|
2866
2723
|
|
2867
|
-
|
2724
|
+
this.set('firstName', name[0]);
|
2725
|
+
this.set('lastName', name[1]);
|
2868
2726
|
|
2869
|
-
|
2870
|
-
|
2871
|
-
|
2727
|
+
return value;
|
2728
|
+
}
|
2729
|
+
}.property('firstName', 'lastName')
|
2872
2730
|
});
|
2873
2731
|
|
2874
|
-
var
|
2732
|
+
var person = Person.create();
|
2875
2733
|
|
2876
|
-
|
2877
|
-
|
2878
|
-
|
2879
|
-
hamster.set('numBananas', 2);
|
2880
|
-
hamster.get('needsMoreBananas'); // true
|
2734
|
+
person.set('fullName', 'Peter Wagenet');
|
2735
|
+
person.get('firstName'); // 'Peter'
|
2736
|
+
person.get('lastName'); // 'Wagenet'
|
2881
2737
|
```
|
2882
2738
|
|
2883
|
-
@
|
2884
|
-
@
|
2885
|
-
@
|
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.
|
2739
|
+
@class ComputedProperty
|
2740
|
+
@namespace Ember
|
2741
|
+
@constructor
|
2889
2742
|
@public
|
2890
2743
|
*/
|
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
|
+
}
|
2891
2762
|
|
2892
|
-
|
2893
|
-
|
2894
|
-
|
2895
|
-
|
2763
|
+
this._dependentKeys = undefined;
|
2764
|
+
this._suspended = undefined;
|
2765
|
+
this._meta = undefined;
|
2766
|
+
|
2767
|
+
_emberMetalCore["default"].deprecate("Passing opts.cacheable to the CP constructor is deprecated. Invoke `volatile()` on the CP instead.", !opts || !opts.hasOwnProperty('cacheable'));
|
2768
|
+
this._cacheable = opts && opts.cacheable !== undefined ? opts.cacheable : true; // TODO: Set always to `true` once this deprecation is gone.
|
2769
|
+
this._dependentKeys = opts && opts.dependentKeys;
|
2770
|
+
_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'));
|
2771
|
+
this._readOnly = opts && (opts.readOnly !== undefined || !!opts.readOnly) || false; // TODO: Set always to `false` once this deprecation is gone.
|
2896
2772
|
}
|
2897
2773
|
|
2774
|
+
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
2775
|
+
|
2776
|
+
var ComputedPropertyPrototype = ComputedProperty.prototype;
|
2777
|
+
|
2898
2778
|
/**
|
2899
|
-
|
2900
|
-
|
2901
|
-
|
2902
|
-
Example
|
2903
|
-
|
2904
|
-
```javascript
|
2905
|
-
var Hamster = Ember.Object.extend({
|
2906
|
-
needsMoreBananas: Ember.computed.lte('numBananas', 3)
|
2907
|
-
});
|
2779
|
+
Properties are cacheable by default. Computed property will automatically
|
2780
|
+
cache the return value of your function until one of the dependent keys changes.
|
2908
2781
|
|
2909
|
-
|
2782
|
+
Call `volatile()` to set it into non-cached mode. When in this mode
|
2783
|
+
the computed property will not automatically cache the return value.
|
2910
2784
|
|
2911
|
-
|
2912
|
-
|
2913
|
-
hamster.get('needsMoreBananas'); // false
|
2914
|
-
hamster.set('numBananas', 3);
|
2915
|
-
hamster.get('needsMoreBananas'); // true
|
2916
|
-
```
|
2785
|
+
However, if a property is properly observable, there is no reason to disable
|
2786
|
+
caching.
|
2917
2787
|
|
2918
|
-
@method
|
2919
|
-
@
|
2920
|
-
@
|
2921
|
-
@
|
2922
|
-
@
|
2923
|
-
the original value for property is less or equal than given value.
|
2788
|
+
@method cacheable
|
2789
|
+
@param {Boolean} aFlag optional set to `false` to disable caching
|
2790
|
+
@return {Ember.ComputedProperty} this
|
2791
|
+
@chainable
|
2792
|
+
@deprecated All computed properties are cacheble by default. Use `volatile()` instead to opt-out to caching.
|
2924
2793
|
@public
|
2925
2794
|
*/
|
2926
|
-
|
2927
|
-
|
2928
|
-
|
2929
|
-
|
2930
|
-
|
2931
|
-
}
|
2795
|
+
ComputedPropertyPrototype.cacheable = function (aFlag) {
|
2796
|
+
_emberMetalCore["default"].deprecate('ComputedProperty.cacheable() is deprecated. All computed properties are cacheable by default.');
|
2797
|
+
this._cacheable = aFlag !== false;
|
2798
|
+
return this;
|
2799
|
+
};
|
2932
2800
|
|
2933
2801
|
/**
|
2934
|
-
|
2935
|
-
|
2936
|
-
|
2937
|
-
Example
|
2802
|
+
Call on a computed property to set it into non-cached mode. When in this
|
2803
|
+
mode the computed property will not automatically cache the return value.
|
2938
2804
|
|
2939
2805
|
```javascript
|
2940
|
-
var
|
2941
|
-
|
2942
|
-
|
2943
|
-
|
2944
|
-
|
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'
|
2806
|
+
var outsideService = Ember.Object.extend({
|
2807
|
+
value: function() {
|
2808
|
+
return OutsideService.getValue();
|
2809
|
+
}.property().volatile()
|
2810
|
+
}).create();
|
2953
2811
|
```
|
2954
2812
|
|
2955
|
-
@method
|
2956
|
-
@
|
2957
|
-
@
|
2958
|
-
@return {Ember.ComputedProperty} computed property which performs
|
2959
|
-
a logical `and` on the values of all the original values for properties.
|
2813
|
+
@method volatile
|
2814
|
+
@return {Ember.ComputedProperty} this
|
2815
|
+
@chainable
|
2960
2816
|
@public
|
2961
2817
|
*/
|
2962
|
-
|
2963
|
-
|
2964
|
-
|
2965
|
-
|
2966
|
-
if (properties.hasOwnProperty(key) && !value) {
|
2967
|
-
return false;
|
2968
|
-
}
|
2969
|
-
}
|
2970
|
-
return value;
|
2971
|
-
});
|
2818
|
+
ComputedPropertyPrototype["volatile"] = function () {
|
2819
|
+
this._cacheable = false;
|
2820
|
+
return this;
|
2821
|
+
};
|
2972
2822
|
|
2973
|
-
exports.and = and;
|
2974
2823
|
/**
|
2975
|
-
|
2976
|
-
|
2977
|
-
|
2978
|
-
Example
|
2824
|
+
Call on a computed property to set it into read-only mode. When in this
|
2825
|
+
mode the computed property will throw an error when set.
|
2979
2826
|
|
2980
2827
|
```javascript
|
2981
|
-
var
|
2982
|
-
|
2828
|
+
var Person = Ember.Object.extend({
|
2829
|
+
guid: function() {
|
2830
|
+
return 'guid-guid-guid';
|
2831
|
+
}.property().readOnly()
|
2983
2832
|
});
|
2984
2833
|
|
2985
|
-
var
|
2986
|
-
|
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'
|
2992
|
-
```
|
2834
|
+
var person = Person.create();
|
2993
2835
|
|
2994
|
-
|
2995
|
-
|
2996
|
-
|
2997
|
-
@
|
2998
|
-
|
2836
|
+
person.set('guid', 'new-guid'); // will throw an exception
|
2837
|
+
```
|
2838
|
+
|
2839
|
+
@method readOnly
|
2840
|
+
@return {Ember.ComputedProperty} this
|
2841
|
+
@chainable
|
2999
2842
|
@public
|
3000
2843
|
*/
|
3001
|
-
|
3002
|
-
|
3003
|
-
|
3004
|
-
|
3005
|
-
|
3006
|
-
|
3007
|
-
return false;
|
3008
|
-
});
|
2844
|
+
ComputedPropertyPrototype.readOnly = function (readOnly) {
|
2845
|
+
_emberMetalCore["default"].deprecate('Passing arguments to ComputedProperty.readOnly() is deprecated.', arguments.length === 0);
|
2846
|
+
this._readOnly = readOnly === undefined || !!readOnly; // Force to true once this deprecation is gone
|
2847
|
+
_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));
|
2848
|
+
return this;
|
2849
|
+
};
|
3009
2850
|
|
3010
|
-
exports.or = or;
|
3011
2851
|
/**
|
3012
|
-
|
3013
|
-
|
3014
|
-
|
3015
|
-
Example
|
2852
|
+
Sets the dependent keys on this computed property. Pass any number of
|
2853
|
+
arguments containing key paths that this computed property depends on.
|
3016
2854
|
|
3017
2855
|
```javascript
|
3018
|
-
var
|
3019
|
-
|
2856
|
+
var President = Ember.Object.extend({
|
2857
|
+
fullName: computed(function() {
|
2858
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2859
|
+
|
2860
|
+
// Tell Ember that this computed property depends on firstName
|
2861
|
+
// and lastName
|
2862
|
+
}).property('firstName', 'lastName')
|
3020
2863
|
});
|
3021
2864
|
|
3022
|
-
var
|
2865
|
+
var president = President.create({
|
2866
|
+
firstName: 'Barack',
|
2867
|
+
lastName: 'Obama'
|
2868
|
+
});
|
3023
2869
|
|
3024
|
-
|
3025
|
-
hamster.set('shirt', 'Hawaiian Shirt');
|
3026
|
-
hamster.get('hasClothes'); // 'Hawaiian Shirt'
|
2870
|
+
president.get('fullName'); // 'Barack Obama'
|
3027
2871
|
```
|
3028
2872
|
|
3029
|
-
@method
|
3030
|
-
@
|
3031
|
-
@
|
3032
|
-
@
|
3033
|
-
the first truthy value of given list of properties.
|
3034
|
-
@deprecated Use `Ember.computed.or` instead.
|
2873
|
+
@method property
|
2874
|
+
@param {String} path* zero or more property paths
|
2875
|
+
@return {Ember.ComputedProperty} this
|
2876
|
+
@chainable
|
3035
2877
|
@public
|
3036
2878
|
*/
|
3037
|
-
|
3038
|
-
|
3039
|
-
|
3040
|
-
|
3041
|
-
|
3042
|
-
|
2879
|
+
ComputedPropertyPrototype.property = function () {
|
2880
|
+
var args;
|
2881
|
+
|
2882
|
+
var addArg = function (property) {
|
2883
|
+
_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' });
|
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);
|
3043
2891
|
}
|
3044
|
-
return null;
|
3045
|
-
});
|
3046
2892
|
|
3047
|
-
|
2893
|
+
this._dependentKeys = args;
|
2894
|
+
return this;
|
2895
|
+
};
|
2896
|
+
|
3048
2897
|
/**
|
3049
|
-
|
3050
|
-
|
3051
|
-
|
3052
|
-
|
3053
|
-
|
3054
|
-
```javascript
|
3055
|
-
var Hamster = Ember.Object.extend({
|
3056
|
-
clothes: Ember.computed.collect('hat', 'shirt')
|
3057
|
-
});
|
2898
|
+
In some cases, you may want to annotate computed properties with additional
|
2899
|
+
metadata about how they function or what values they operate on. For example,
|
2900
|
+
computed property functions may close over variables that are then no longer
|
2901
|
+
available for introspection.
|
3058
2902
|
|
3059
|
-
|
2903
|
+
You can pass a hash of these values to a computed property like this:
|
3060
2904
|
|
3061
|
-
|
3062
|
-
|
3063
|
-
|
3064
|
-
|
2905
|
+
```
|
2906
|
+
person: function() {
|
2907
|
+
var personId = this.get('personId');
|
2908
|
+
return App.Person.create({ id: personId });
|
2909
|
+
}.property().meta({ type: App.Person })
|
3065
2910
|
```
|
3066
2911
|
|
3067
|
-
|
3068
|
-
|
3069
|
-
|
3070
|
-
|
3071
|
-
|
2912
|
+
The hash that you pass to the `meta()` function will be saved on the
|
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.
|
2916
|
+
|
2917
|
+
@method meta
|
2918
|
+
@param {Object} meta
|
2919
|
+
@chainable
|
3072
2920
|
@public
|
3073
2921
|
*/
|
3074
|
-
|
3075
|
-
|
3076
|
-
|
3077
|
-
|
3078
|
-
|
3079
|
-
|
3080
|
-
|
3081
|
-
|
3082
|
-
|
2922
|
+
|
2923
|
+
ComputedPropertyPrototype.meta = function (meta) {
|
2924
|
+
if (arguments.length === 0) {
|
2925
|
+
return this._meta || {};
|
2926
|
+
} else {
|
2927
|
+
this._meta = meta;
|
2928
|
+
return this;
|
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);
|
3083
2941
|
}
|
3084
2942
|
}
|
3085
|
-
|
3086
|
-
|
2943
|
+
};
|
2944
|
+
|
2945
|
+
function finishChains(chainNodes) {
|
2946
|
+
for (var i = 0, l = chainNodes.length; i < l; i++) {
|
2947
|
+
chainNodes[i].didChange(null);
|
2948
|
+
}
|
2949
|
+
}
|
3087
2950
|
|
3088
|
-
exports.collect = collect;
|
3089
2951
|
/**
|
3090
|
-
|
3091
|
-
|
3092
|
-
|
2952
|
+
Access the value of the function backing the computed property.
|
2953
|
+
If this property has already been cached, return the cached result.
|
2954
|
+
Otherwise, call the function passing the property name as an argument.
|
3093
2955
|
|
3094
2956
|
```javascript
|
3095
2957
|
var Person = Ember.Object.extend({
|
3096
|
-
|
3097
|
-
|
2958
|
+
fullName: function(keyName) {
|
2959
|
+
// the keyName parameter is 'fullName' in this case.
|
2960
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
2961
|
+
}.property('firstName', 'lastName')
|
3098
2962
|
});
|
3099
2963
|
|
3100
|
-
var alex = Person.create();
|
3101
2964
|
|
3102
|
-
|
3103
|
-
|
2965
|
+
var tom = Person.create({
|
2966
|
+
firstName: 'Tom',
|
2967
|
+
lastName: 'Dale'
|
2968
|
+
});
|
3104
2969
|
|
3105
|
-
|
3106
|
-
alex.get('name'); // '@machty'
|
2970
|
+
tom.get('fullName') // 'Tom Dale'
|
3107
2971
|
```
|
3108
2972
|
|
3109
|
-
@method
|
3110
|
-
@
|
3111
|
-
@
|
3112
|
-
@return {Ember.ComputedProperty} computed property which creates an
|
3113
|
-
alias to the original value for property.
|
2973
|
+
@method get
|
2974
|
+
@param {String} keyName The key being accessed.
|
2975
|
+
@return {Object} The return value of the function backing the CP.
|
3114
2976
|
@public
|
3115
2977
|
*/
|
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
|
+
};
|
3116
3013
|
|
3117
3014
|
/**
|
3118
|
-
|
3119
|
-
|
3120
|
-
|
3121
|
-
|
3122
|
-
diverge from the upstream property.
|
3015
|
+
Set the value of a computed property. If the function that backs your
|
3016
|
+
computed property does not accept arguments then the default action for
|
3017
|
+
setting would be to define the property on the current object, and set
|
3018
|
+
the value of the property to the value being set.
|
3123
3019
|
|
3124
|
-
|
3020
|
+
Generally speaking if you intend for your computed property to be set
|
3021
|
+
your backing function should accept either two or three arguments.
|
3125
3022
|
|
3126
3023
|
```javascript
|
3127
|
-
var
|
3024
|
+
var Person = Ember.Object.extend({
|
3025
|
+
// these will be supplied by `create`
|
3128
3026
|
firstName: null,
|
3129
3027
|
lastName: null,
|
3130
|
-
nickName: Ember.computed.oneWay('firstName')
|
3131
|
-
});
|
3132
3028
|
|
3133
|
-
|
3134
|
-
|
3135
|
-
|
3029
|
+
fullName: function(key, value, oldValue) {
|
3030
|
+
// getter
|
3031
|
+
if (arguments.length === 1) {
|
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')
|
3136
3047
|
});
|
3137
3048
|
|
3138
|
-
|
3139
|
-
|
3140
|
-
|
3049
|
+
var person = Person.create();
|
3050
|
+
|
3051
|
+
person.set('fullName', 'Peter Wagenet');
|
3052
|
+
person.get('firstName'); // 'Peter'
|
3053
|
+
person.get('lastName'); // 'Wagenet'
|
3141
3054
|
```
|
3142
3055
|
|
3143
|
-
@method
|
3144
|
-
@
|
3145
|
-
@param {
|
3146
|
-
@
|
3147
|
-
|
3056
|
+
@method set
|
3057
|
+
@param {String} keyName The key being accessed.
|
3058
|
+
@param {Object} newValue The new value being assigned.
|
3059
|
+
@param {String} oldValue The old value being replaced.
|
3060
|
+
@return {Object} The return value of the function backing the CP.
|
3148
3061
|
@public
|
3149
3062
|
*/
|
3063
|
+
ComputedPropertyPrototype.set = function computedPropertySetWithSuspend(obj, keyName, value) {
|
3064
|
+
var oldSuspended = this._suspended;
|
3150
3065
|
|
3151
|
-
|
3152
|
-
return _emberMetalAlias["default"](dependentKey).oneWay();
|
3153
|
-
}
|
3066
|
+
this._suspended = obj;
|
3154
3067
|
|
3155
|
-
|
3156
|
-
|
3157
|
-
|
3158
|
-
|
3159
|
-
|
3160
|
-
|
3161
|
-
|
3162
|
-
|
3163
|
-
|
3164
|
-
|
3165
|
-
|
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
|
+
|
3151
|
+
if (this._cacheable) {
|
3152
|
+
delete meta.cache[keyName];
|
3153
|
+
}
|
3154
|
+
}
|
3155
|
+
|
3156
|
+
return null; // no value to restore
|
3157
|
+
};
|
3166
3158
|
|
3167
3159
|
/**
|
3168
|
-
|
3169
|
-
|
3170
|
-
|
3160
|
+
This helper returns a new property descriptor that wraps the passed
|
3161
|
+
computed property function. You can use this helper to define properties
|
3162
|
+
with mixins or via `Ember.defineProperty()`.
|
3171
3163
|
|
3172
|
-
|
3164
|
+
The function you pass will be used to both get and set property values.
|
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.
|
3173
3168
|
|
3174
|
-
|
3169
|
+
A computed property defined in this way might look like this:
|
3175
3170
|
|
3176
|
-
```
|
3177
|
-
var
|
3178
|
-
firstName:
|
3179
|
-
lastName:
|
3180
|
-
nickName: Ember.computed.readOnly('firstName')
|
3181
|
-
});
|
3171
|
+
```js
|
3172
|
+
var Person = Ember.Object.extend({
|
3173
|
+
firstName: 'Betty',
|
3174
|
+
lastName: 'Jones',
|
3182
3175
|
|
3183
|
-
|
3184
|
-
|
3185
|
-
|
3176
|
+
fullName: Ember.computed('firstName', 'lastName', function(key, value) {
|
3177
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
3178
|
+
})
|
3186
3179
|
});
|
3187
3180
|
|
3188
|
-
|
3189
|
-
teddy.set('nickName', 'TeddyBear'); // throws Exception
|
3190
|
-
// throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
|
3191
|
-
teddy.get('firstName'); // 'Teddy'
|
3192
|
-
```
|
3181
|
+
var client = Person.create();
|
3193
3182
|
|
3194
|
-
|
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
|
3183
|
+
client.get('fullName'); // 'Betty Jones'
|
3211
3184
|
|
3212
|
-
|
3185
|
+
client.set('lastName', 'Fuller');
|
3186
|
+
client.get('fullName'); // 'Betty Fuller'
|
3187
|
+
```
|
3213
3188
|
|
3214
|
-
|
3215
|
-
|
3216
|
-
|
3217
|
-
});
|
3189
|
+
_Note: This is the preferred way to define computed properties when writing third-party
|
3190
|
+
libraries that depend on or use Ember, since there is no guarantee that the user
|
3191
|
+
will have prototype extensions enabled._
|
3218
3192
|
|
3219
|
-
|
3193
|
+
You might use this method if you disabled
|
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):
|
3220
3197
|
|
3221
|
-
|
3222
|
-
|
3223
|
-
|
3224
|
-
|
3198
|
+
```js
|
3199
|
+
fullName: function () {
|
3200
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
3201
|
+
}.property('firstName', 'lastName')
|
3225
3202
|
```
|
3226
3203
|
|
3227
|
-
@
|
3228
|
-
@
|
3229
|
-
@
|
3230
|
-
@
|
3231
|
-
|
3232
|
-
@
|
3204
|
+
@class computed
|
3205
|
+
@namespace Ember
|
3206
|
+
@constructor
|
3207
|
+
@static
|
3208
|
+
@param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
|
3209
|
+
@param {Function} func The computed property function.
|
3210
|
+
@return {Ember.ComputedProperty} property descriptor instance
|
3233
3211
|
@public
|
3234
3212
|
*/
|
3213
|
+
function computed(func) {
|
3214
|
+
var args;
|
3235
3215
|
|
3236
|
-
|
3237
|
-
|
3238
|
-
|
3239
|
-
|
3240
|
-
return _emberMetalProperty_get.get(this, defaultPath);
|
3241
|
-
},
|
3216
|
+
if (arguments.length > 1) {
|
3217
|
+
args = [].slice.call(arguments);
|
3218
|
+
func = args.pop();
|
3219
|
+
}
|
3242
3220
|
|
3243
|
-
|
3244
|
-
|
3245
|
-
|
3246
|
-
|
3247
|
-
}
|
3221
|
+
var cp = new ComputedProperty(func);
|
3222
|
+
|
3223
|
+
if (args) {
|
3224
|
+
cp.property.apply(cp, args);
|
3225
|
+
}
|
3226
|
+
|
3227
|
+
return cp;
|
3248
3228
|
}
|
3249
3229
|
|
3250
3230
|
/**
|
3251
|
-
|
3252
|
-
|
3253
|
-
|
3254
|
-
|
3231
|
+
Returns the cached value for a property, if one exists.
|
3232
|
+
This can be useful for peeking at the value of a computed
|
3233
|
+
property that is generated lazily, without accidentally causing
|
3234
|
+
it to be created.
|
3255
3235
|
|
3256
|
-
@method
|
3257
|
-
@for Ember
|
3258
|
-
@param {
|
3259
|
-
@
|
3260
|
-
|
3261
|
-
@
|
3236
|
+
@method cacheFor
|
3237
|
+
@for Ember
|
3238
|
+
@param {Object} obj the object whose property you want to check
|
3239
|
+
@param {String} key the name of the property whose cached value you want
|
3240
|
+
to return
|
3241
|
+
@return {Object} the cached value
|
3262
3242
|
@public
|
3263
3243
|
*/
|
3244
|
+
function cacheFor(obj, key) {
|
3245
|
+
var meta = obj['__ember_meta__'];
|
3246
|
+
var cache = meta && meta.cache;
|
3247
|
+
var ret = cache && cache[key];
|
3264
3248
|
|
3265
|
-
|
3266
|
-
|
3267
|
-
|
3268
|
-
|
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
|
-
});
|
3249
|
+
if (ret === UNDEFINED) {
|
3250
|
+
return undefined;
|
3251
|
+
}
|
3252
|
+
return ret;
|
3277
3253
|
}
|
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.12
|
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.12'
|
3337
3337
|
@static
|
3338
3338
|
@public
|
3339
3339
|
*/
|
3340
|
-
Ember.VERSION = '1.13.
|
3340
|
+
Ember.VERSION = '1.13.12';
|
3341
3341
|
|
3342
3342
|
/**
|
3343
3343
|
The hash of environment variables used to control various configuration
|
@@ -6980,6 +6980,75 @@ 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
|
+
});
|
6983
7052
|
enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/array", "ember-metal/events"], function (exports, _emberMetalWatching, _emberMetalArray, _emberMetalEvents) {
|
6984
7053
|
"use strict";
|
6985
7054
|
|
@@ -7110,75 +7179,6 @@ enifed("ember-metal/observer", ["exports", "ember-metal/watching", "ember-metal/
|
|
7110
7179
|
return this;
|
7111
7180
|
}
|
7112
7181
|
});
|
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,41 +12589,6 @@ 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
|
-
});
|
12627
12592
|
enifed("ember-template-compiler/system/compile_options", ["exports", "ember-metal/core", "ember-metal/merge", "ember-template-compiler/plugins"], function (exports, _emberMetalCore, _emberMetalMerge, _emberTemplateCompilerPlugins) {
|
12628
12593
|
/**
|
12629
12594
|
@module ember
|
@@ -12663,7 +12628,7 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
|
|
12663
12628
|
|
12664
12629
|
options.buildMeta = function buildMeta(program) {
|
12665
12630
|
return {
|
12666
|
-
revision: 'Ember@1.13.
|
12631
|
+
revision: 'Ember@1.13.12',
|
12667
12632
|
loc: program.loc,
|
12668
12633
|
moduleName: options.moduleName
|
12669
12634
|
};
|
@@ -12672,6 +12637,41 @@ enifed("ember-template-compiler/system/compile_options", ["exports", "ember-meta
|
|
12672
12637
|
return options;
|
12673
12638
|
};
|
12674
12639
|
});
|
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
|
@@ -19137,8 +19137,8 @@ enifed('morph-range', ['exports', './morph-range/utils'], function (exports, _mo
|
|
19137
19137
|
return this.setNode(content);
|
19138
19138
|
}
|
19139
19139
|
/* Handlebars.SafeString */
|
19140
|
-
if (typeof content.
|
19141
|
-
return this.setHTML(content.
|
19140
|
+
if (typeof content.toHTML === 'function') {
|
19141
|
+
return this.setHTML(content.toHTML());
|
19142
19142
|
}
|
19143
19143
|
if (this.parseTextAsHTML) {
|
19144
19144
|
return this.setHTML(content.toString());
|