ember-source 2.1.0.beta.1 → 2.1.0.beta.3
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.
Potentially problematic release.
This version of ember-source might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/dist/ember-template-compiler.js +1506 -1535
- data/dist/ember-testing.js +1 -1
- data/dist/ember.debug.js +2497 -2453
- data/dist/ember.js +2497 -2453
- data/dist/ember.min.js +13 -13
- data/dist/ember.prod.js +2431 -2334
- 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: f2284a5b71f00658d9db7799a1e917e600f5045b
|
4
|
+
data.tar.gz: b7cf04882c51e5e4ef9aa0f356427c2dd102aeee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7463bcbdf2343c68bf167edf5b47a1296688914010e83e125201f46c47a26c2cc67aec80cf7f2219f2534b25790af50f48f52c1b4f86b0d89cba9aa16b7b1ac9
|
7
|
+
data.tar.gz: ffa2f4f6dcc0a4be0ac41f1a462989d4764d66aab2d3fe1dc1816ec3455b8967442b371e45cbf9e38ccad4e398afa374100d3fe0fb3e7b386fb6d634e1b360ae
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.0-beta.
|
1
|
+
2.1.0-beta.3
|
@@ -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 2.1.0-beta.
|
8
|
+
* @version 2.1.0-beta.3
|
9
9
|
*/
|
10
10
|
|
11
11
|
(function() {
|
@@ -2897,1303 +2897,1314 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/core', 'ember-metal/proper
|
|
2897
2897
|
exports.ChainNode = ChainNode;
|
2898
2898
|
});
|
2899
2899
|
// warn, assert, etc;
|
2900
|
-
enifed('ember-metal/
|
2900
|
+
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) {
|
2901
2901
|
'use strict';
|
2902
2902
|
|
2903
|
-
exports.
|
2903
|
+
exports.empty = empty;
|
2904
|
+
exports.notEmpty = notEmpty;
|
2905
|
+
exports.none = none;
|
2906
|
+
exports.not = not;
|
2907
|
+
exports.bool = bool;
|
2908
|
+
exports.match = match;
|
2909
|
+
exports.equal = equal;
|
2910
|
+
exports.gt = gt;
|
2911
|
+
exports.gte = gte;
|
2912
|
+
exports.lt = lt;
|
2913
|
+
exports.lte = lte;
|
2914
|
+
exports.oneWay = oneWay;
|
2915
|
+
exports.readOnly = readOnly;
|
2916
|
+
exports.deprecatingAlias = deprecatingAlias;
|
2904
2917
|
|
2905
2918
|
/**
|
2906
2919
|
@module ember
|
2907
2920
|
@submodule ember-metal
|
2908
2921
|
*/
|
2909
2922
|
|
2910
|
-
|
2923
|
+
function getProperties(self, propertyNames) {
|
2924
|
+
var ret = {};
|
2925
|
+
for (var i = 0; i < propertyNames.length; i++) {
|
2926
|
+
ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
|
2927
|
+
}
|
2928
|
+
return ret;
|
2929
|
+
}
|
2911
2930
|
|
2912
|
-
function
|
2931
|
+
function generateComputedWithProperties(macro) {
|
2932
|
+
return function () {
|
2933
|
+
for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
|
2934
|
+
properties[_key] = arguments[_key];
|
2935
|
+
}
|
2913
2936
|
|
2914
|
-
|
2915
|
-
|
2916
|
-
|
2937
|
+
var computedFunc = _emberMetalComputed.computed(function () {
|
2938
|
+
return macro.apply(this, [getProperties(this, properties)]);
|
2939
|
+
});
|
2940
|
+
|
2941
|
+
return computedFunc.property.apply(computedFunc, properties);
|
2942
|
+
};
|
2943
|
+
}
|
2917
2944
|
|
2918
2945
|
/**
|
2919
|
-
A computed property
|
2920
|
-
|
2921
|
-
By default the function backing the computed property will only be called
|
2922
|
-
once and the result will be cached. You can specify various properties
|
2923
|
-
that your computed property depends on. This will force the cached
|
2924
|
-
result to be recomputed if the dependencies are modified.
|
2946
|
+
A computed property that returns true if the value of the dependent
|
2947
|
+
property is null, an empty string, empty array, or empty function.
|
2925
2948
|
|
2926
|
-
|
2927
|
-
`.property()` on the fullName function) and setup the property
|
2928
|
-
dependencies (depending on firstName and lastName). The fullName function
|
2929
|
-
will be called once (regardless of how many times it is accessed) as long
|
2930
|
-
as its dependencies have not changed. Once firstName or lastName are updated
|
2931
|
-
any future calls (or anything bound) to fullName will incorporate the new
|
2932
|
-
values.
|
2949
|
+
Example
|
2933
2950
|
|
2934
2951
|
```javascript
|
2935
|
-
var
|
2936
|
-
|
2937
|
-
firstName: null,
|
2938
|
-
lastName: null,
|
2939
|
-
|
2940
|
-
fullName: function() {
|
2941
|
-
var firstName = this.get('firstName');
|
2942
|
-
var lastName = this.get('lastName');
|
2943
|
-
|
2944
|
-
return firstName + ' ' + lastName;
|
2945
|
-
}.property('firstName', 'lastName')
|
2952
|
+
var ToDoList = Ember.Object.extend({
|
2953
|
+
isDone: Ember.computed.empty('todos')
|
2946
2954
|
});
|
2947
2955
|
|
2948
|
-
var
|
2949
|
-
|
2950
|
-
lastName: 'Dale'
|
2956
|
+
var todoList = ToDoList.create({
|
2957
|
+
todos: ['Unit Test', 'Documentation', 'Release']
|
2951
2958
|
});
|
2952
2959
|
|
2953
|
-
|
2960
|
+
todoList.get('isDone'); // false
|
2961
|
+
todoList.get('todos').clear();
|
2962
|
+
todoList.get('isDone'); // true
|
2954
2963
|
```
|
2955
2964
|
|
2956
|
-
|
2957
|
-
|
2958
|
-
|
2959
|
-
|
2960
|
-
|
2961
|
-
|
2962
|
-
|
2963
|
-
|
2964
|
-
|
2965
|
-
|
2966
|
-
|
2967
|
-
|
2968
|
-
|
2969
|
-
|
2970
|
-
|
2971
|
-
|
2972
|
-
|
2973
|
-
|
2974
|
-
|
2975
|
-
// setter
|
2976
|
-
} else {
|
2977
|
-
var name = value.split(' ');
|
2965
|
+
@since 1.6.0
|
2966
|
+
@method empty
|
2967
|
+
@for Ember.computed
|
2968
|
+
@param {String} dependentKey
|
2969
|
+
@return {Ember.ComputedProperty} computed property which negate
|
2970
|
+
the original value for property
|
2971
|
+
@public
|
2972
|
+
*/
|
2973
|
+
|
2974
|
+
function empty(dependentKey) {
|
2975
|
+
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
2976
|
+
return _emberMetalIs_empty.default(_emberMetalProperty_get.get(this, dependentKey));
|
2977
|
+
});
|
2978
|
+
}
|
2979
|
+
|
2980
|
+
/**
|
2981
|
+
A computed property that returns true if the value of the dependent
|
2982
|
+
property is NOT null, an empty string, empty array, or empty function.
|
2978
2983
|
|
2979
|
-
|
2980
|
-
this.set('lastName', name[1]);
|
2984
|
+
Example
|
2981
2985
|
|
2982
|
-
|
2983
|
-
|
2984
|
-
|
2986
|
+
```javascript
|
2987
|
+
var Hamster = Ember.Object.extend({
|
2988
|
+
hasStuff: Ember.computed.notEmpty('backpack')
|
2985
2989
|
});
|
2986
2990
|
|
2987
|
-
var
|
2991
|
+
var hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
|
2988
2992
|
|
2989
|
-
|
2990
|
-
|
2991
|
-
|
2993
|
+
hamster.get('hasStuff'); // true
|
2994
|
+
hamster.get('backpack').clear(); // []
|
2995
|
+
hamster.get('hasStuff'); // false
|
2992
2996
|
```
|
2993
2997
|
|
2994
|
-
@
|
2995
|
-
@
|
2996
|
-
@
|
2998
|
+
@method notEmpty
|
2999
|
+
@for Ember.computed
|
3000
|
+
@param {String} dependentKey
|
3001
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3002
|
+
original value for property is not empty.
|
2997
3003
|
@public
|
2998
3004
|
*/
|
2999
|
-
function ComputedProperty(config, opts) {
|
3000
|
-
this.isDescriptor = true;
|
3001
|
-
if (typeof config === 'function') {
|
3002
|
-
this._getter = config;
|
3003
|
-
} else {
|
3004
|
-
this._getter = config.get;
|
3005
|
-
this._setter = config.set;
|
3006
|
-
}
|
3007
|
-
this._dependentKeys = undefined;
|
3008
|
-
this._suspended = undefined;
|
3009
|
-
this._meta = undefined;
|
3010
|
-
this._volatile = false;
|
3011
|
-
this._dependentKeys = opts && opts.dependentKeys;
|
3012
|
-
this._readOnly = false;
|
3013
|
-
}
|
3014
|
-
|
3015
|
-
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
3016
3005
|
|
3017
|
-
|
3006
|
+
function notEmpty(dependentKey) {
|
3007
|
+
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
3008
|
+
return !_emberMetalIs_empty.default(_emberMetalProperty_get.get(this, dependentKey));
|
3009
|
+
});
|
3010
|
+
}
|
3018
3011
|
|
3019
3012
|
/**
|
3020
|
-
|
3021
|
-
|
3022
|
-
|
3023
|
-
It also does not automatically fire any change events. You must manually notify
|
3024
|
-
any changes if you want to observe this property.
|
3013
|
+
A computed property that returns true if the value of the dependent
|
3014
|
+
property is null or undefined. This avoids errors from JSLint complaining
|
3015
|
+
about use of ==, which can be technically confusing.
|
3025
3016
|
|
3026
|
-
|
3027
|
-
invalidation and notification when cached value is invalidated.
|
3017
|
+
Example
|
3028
3018
|
|
3029
3019
|
```javascript
|
3030
|
-
var
|
3031
|
-
|
3032
|
-
|
3033
|
-
|
3034
|
-
|
3020
|
+
var Hamster = Ember.Object.extend({
|
3021
|
+
isHungry: Ember.computed.none('food')
|
3022
|
+
});
|
3023
|
+
|
3024
|
+
var hamster = Hamster.create();
|
3025
|
+
|
3026
|
+
hamster.get('isHungry'); // true
|
3027
|
+
hamster.set('food', 'Banana');
|
3028
|
+
hamster.get('isHungry'); // false
|
3029
|
+
hamster.set('food', null);
|
3030
|
+
hamster.get('isHungry'); // true
|
3035
3031
|
```
|
3036
3032
|
|
3037
|
-
@method
|
3038
|
-
@
|
3039
|
-
@
|
3033
|
+
@method none
|
3034
|
+
@for Ember.computed
|
3035
|
+
@param {String} dependentKey
|
3036
|
+
@return {Ember.ComputedProperty} computed property which
|
3037
|
+
returns true if original value for property is null or undefined.
|
3040
3038
|
@public
|
3041
3039
|
*/
|
3042
|
-
|
3043
|
-
|
3044
|
-
return
|
3045
|
-
|
3040
|
+
|
3041
|
+
function none(dependentKey) {
|
3042
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3043
|
+
return _emberMetalIs_none.default(_emberMetalProperty_get.get(this, dependentKey));
|
3044
|
+
});
|
3045
|
+
}
|
3046
3046
|
|
3047
3047
|
/**
|
3048
|
-
|
3049
|
-
|
3048
|
+
A computed property that returns the inverse boolean value
|
3049
|
+
of the original value for the dependent property.
|
3050
|
+
|
3051
|
+
Example
|
3050
3052
|
|
3051
3053
|
```javascript
|
3052
|
-
var
|
3053
|
-
|
3054
|
-
return 'guid-guid-guid';
|
3055
|
-
}.property().readOnly()
|
3054
|
+
var User = Ember.Object.extend({
|
3055
|
+
isAnonymous: Ember.computed.not('loggedIn')
|
3056
3056
|
});
|
3057
3057
|
|
3058
|
-
var
|
3058
|
+
var user = User.create({loggedIn: false});
|
3059
3059
|
|
3060
|
-
|
3060
|
+
user.get('isAnonymous'); // true
|
3061
|
+
user.set('loggedIn', true);
|
3062
|
+
user.get('isAnonymous'); // false
|
3061
3063
|
```
|
3062
3064
|
|
3063
|
-
@method
|
3064
|
-
@
|
3065
|
-
@
|
3065
|
+
@method not
|
3066
|
+
@for Ember.computed
|
3067
|
+
@param {String} dependentKey
|
3068
|
+
@return {Ember.ComputedProperty} computed property which returns
|
3069
|
+
inverse of the original value for property
|
3066
3070
|
@public
|
3067
3071
|
*/
|
3068
|
-
|
3069
|
-
|
3070
|
-
|
3071
|
-
|
3072
|
-
|
3072
|
+
|
3073
|
+
function not(dependentKey) {
|
3074
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3075
|
+
return !_emberMetalProperty_get.get(this, dependentKey);
|
3076
|
+
});
|
3077
|
+
}
|
3073
3078
|
|
3074
3079
|
/**
|
3075
|
-
|
3076
|
-
|
3080
|
+
A computed property that converts the provided dependent property
|
3081
|
+
into a boolean value.
|
3077
3082
|
|
3078
3083
|
```javascript
|
3079
|
-
var
|
3080
|
-
|
3081
|
-
return this.get('firstName') + ' ' + this.get('lastName');
|
3082
|
-
|
3083
|
-
// Tell Ember that this computed property depends on firstName
|
3084
|
-
// and lastName
|
3085
|
-
}).property('firstName', 'lastName')
|
3084
|
+
var Hamster = Ember.Object.extend({
|
3085
|
+
hasBananas: Ember.computed.bool('numBananas')
|
3086
3086
|
});
|
3087
3087
|
|
3088
|
-
var
|
3089
|
-
firstName: 'Barack',
|
3090
|
-
lastName: 'Obama'
|
3091
|
-
});
|
3088
|
+
var hamster = Hamster.create();
|
3092
3089
|
|
3093
|
-
|
3090
|
+
hamster.get('hasBananas'); // false
|
3091
|
+
hamster.set('numBananas', 0);
|
3092
|
+
hamster.get('hasBananas'); // false
|
3093
|
+
hamster.set('numBananas', 1);
|
3094
|
+
hamster.get('hasBananas'); // true
|
3095
|
+
hamster.set('numBananas', null);
|
3096
|
+
hamster.get('hasBananas'); // false
|
3094
3097
|
```
|
3095
3098
|
|
3096
|
-
@method
|
3097
|
-
@
|
3098
|
-
@
|
3099
|
-
@
|
3099
|
+
@method bool
|
3100
|
+
@for Ember.computed
|
3101
|
+
@param {String} dependentKey
|
3102
|
+
@return {Ember.ComputedProperty} computed property which converts
|
3103
|
+
to boolean the original value for property
|
3100
3104
|
@public
|
3101
3105
|
*/
|
3102
|
-
ComputedPropertyPrototype.property = function () {
|
3103
|
-
var args;
|
3104
|
-
|
3105
|
-
var addArg = function (property) {
|
3106
|
-
_emberMetalCore.default.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.computed(\'' + property + '\', function() {});` to `Ember.computed(\'' + property.slice(0, -6) + '.[]\', function() {})`.'), property.slice(-5) !== '@each');
|
3107
|
-
args.push(property);
|
3108
|
-
};
|
3109
|
-
|
3110
|
-
args = [];
|
3111
|
-
for (var i = 0, l = arguments.length; i < l; i++) {
|
3112
|
-
_emberMetalExpand_properties.default(arguments[i], addArg);
|
3113
|
-
}
|
3114
3106
|
|
3115
|
-
|
3116
|
-
return
|
3117
|
-
|
3107
|
+
function bool(dependentKey) {
|
3108
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3109
|
+
return !!_emberMetalProperty_get.get(this, dependentKey);
|
3110
|
+
});
|
3111
|
+
}
|
3118
3112
|
|
3119
3113
|
/**
|
3120
|
-
|
3121
|
-
|
3122
|
-
|
3123
|
-
available for introspection.
|
3114
|
+
A computed property which matches the original value for the
|
3115
|
+
dependent property against a given RegExp, returning `true`
|
3116
|
+
if they values matches the RegExp and `false` if it does not.
|
3124
3117
|
|
3125
|
-
|
3118
|
+
Example
|
3126
3119
|
|
3127
|
-
```
|
3128
|
-
|
3129
|
-
|
3130
|
-
|
3131
|
-
}.property().meta({ type: App.Person })
|
3132
|
-
```
|
3120
|
+
```javascript
|
3121
|
+
var User = Ember.Object.extend({
|
3122
|
+
hasValidEmail: Ember.computed.match('email', /^.+@.+\..+$/)
|
3123
|
+
});
|
3133
3124
|
|
3134
|
-
|
3135
|
-
computed property descriptor under the `_meta` key. Ember runtime
|
3136
|
-
exposes a public API for retrieving these values from classes,
|
3137
|
-
via the `metaForProperty()` function.
|
3125
|
+
var user = User.create({loggedIn: false});
|
3138
3126
|
|
3139
|
-
|
3140
|
-
|
3141
|
-
|
3127
|
+
user.get('hasValidEmail'); // false
|
3128
|
+
user.set('email', '');
|
3129
|
+
user.get('hasValidEmail'); // false
|
3130
|
+
user.set('email', 'ember_hamster@example.com');
|
3131
|
+
user.get('hasValidEmail'); // true
|
3132
|
+
```
|
3133
|
+
|
3134
|
+
@method match
|
3135
|
+
@for Ember.computed
|
3136
|
+
@param {String} dependentKey
|
3137
|
+
@param {RegExp} regexp
|
3138
|
+
@return {Ember.ComputedProperty} computed property which match
|
3139
|
+
the original value for property against a given RegExp
|
3142
3140
|
@public
|
3143
3141
|
*/
|
3144
3142
|
|
3145
|
-
|
3146
|
-
|
3147
|
-
|
3148
|
-
} else {
|
3149
|
-
this._meta = meta;
|
3150
|
-
return this;
|
3151
|
-
}
|
3152
|
-
};
|
3153
|
-
|
3154
|
-
// invalidate cache when CP key changes
|
3155
|
-
ComputedPropertyPrototype.didChange = function (obj, keyName) {
|
3156
|
-
// _suspended is set via a CP.set to ensure we don't clear
|
3157
|
-
// the cached value set by the setter
|
3158
|
-
if (this._volatile || this._suspended === obj) {
|
3159
|
-
return;
|
3160
|
-
}
|
3161
|
-
|
3162
|
-
// don't create objects just to invalidate
|
3163
|
-
var meta = obj.__ember_meta__;
|
3164
|
-
if (!meta || meta.source !== obj) {
|
3165
|
-
return;
|
3166
|
-
}
|
3143
|
+
function match(dependentKey, regexp) {
|
3144
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3145
|
+
var value = _emberMetalProperty_get.get(this, dependentKey);
|
3167
3146
|
|
3168
|
-
|
3169
|
-
|
3170
|
-
|
3171
|
-
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
3172
|
-
}
|
3173
|
-
};
|
3147
|
+
return typeof value === 'string' ? regexp.test(value) : false;
|
3148
|
+
});
|
3149
|
+
}
|
3174
3150
|
|
3175
3151
|
/**
|
3176
|
-
|
3177
|
-
|
3178
|
-
|
3152
|
+
A computed property that returns true if the provided dependent property
|
3153
|
+
is equal to the given value.
|
3154
|
+
|
3155
|
+
Example
|
3179
3156
|
|
3180
3157
|
```javascript
|
3181
|
-
var
|
3182
|
-
|
3183
|
-
// the keyName parameter is 'fullName' in this case.
|
3184
|
-
return this.get('firstName') + ' ' + this.get('lastName');
|
3185
|
-
}.property('firstName', 'lastName')
|
3158
|
+
var Hamster = Ember.Object.extend({
|
3159
|
+
napTime: Ember.computed.equal('state', 'sleepy')
|
3186
3160
|
});
|
3187
3161
|
|
3162
|
+
var hamster = Hamster.create();
|
3188
3163
|
|
3189
|
-
|
3190
|
-
|
3191
|
-
|
3192
|
-
|
3193
|
-
|
3194
|
-
tom.get('fullName') // 'Tom Dale'
|
3164
|
+
hamster.get('napTime'); // false
|
3165
|
+
hamster.set('state', 'sleepy');
|
3166
|
+
hamster.get('napTime'); // true
|
3167
|
+
hamster.set('state', 'hungry');
|
3168
|
+
hamster.get('napTime'); // false
|
3195
3169
|
```
|
3196
3170
|
|
3197
|
-
@method
|
3198
|
-
@
|
3199
|
-
@
|
3171
|
+
@method equal
|
3172
|
+
@for Ember.computed
|
3173
|
+
@param {String} dependentKey
|
3174
|
+
@param {String|Number|Object} value
|
3175
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3176
|
+
the original value for property is equal to the given value.
|
3200
3177
|
@public
|
3201
3178
|
*/
|
3202
|
-
ComputedPropertyPrototype.get = function (obj, keyName) {
|
3203
|
-
if (this._volatile) {
|
3204
|
-
return this._getter.call(obj, keyName);
|
3205
|
-
}
|
3206
|
-
|
3207
|
-
var meta = metaFor(obj);
|
3208
|
-
var cache = meta.writableCache();
|
3209
|
-
|
3210
|
-
var result = cache[keyName];
|
3211
|
-
if (result === UNDEFINED) {
|
3212
|
-
return undefined;
|
3213
|
-
} else if (result !== undefined) {
|
3214
|
-
return result;
|
3215
|
-
}
|
3216
|
-
|
3217
|
-
var ret = this._getter.call(obj, keyName);
|
3218
|
-
if (ret === undefined) {
|
3219
|
-
cache[keyName] = UNDEFINED;
|
3220
|
-
} else {
|
3221
|
-
cache[keyName] = ret;
|
3222
|
-
}
|
3223
|
-
|
3224
|
-
var chainWatchers = meta.readableChainWatchers();
|
3225
|
-
if (chainWatchers) {
|
3226
|
-
chainWatchers.revalidate(keyName);
|
3227
|
-
}
|
3228
|
-
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
3229
3179
|
|
3230
|
-
|
3231
|
-
|
3180
|
+
function equal(dependentKey, value) {
|
3181
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3182
|
+
return _emberMetalProperty_get.get(this, dependentKey) === value;
|
3183
|
+
});
|
3184
|
+
}
|
3232
3185
|
|
3233
3186
|
/**
|
3234
|
-
|
3235
|
-
|
3236
|
-
setting would be to define the property on the current object, and set
|
3237
|
-
the value of the property to the value being set.
|
3187
|
+
A computed property that returns true if the provided dependent property
|
3188
|
+
is greater than the provided value.
|
3238
3189
|
|
3239
|
-
|
3240
|
-
your backing function should accept either two or three arguments.
|
3190
|
+
Example
|
3241
3191
|
|
3242
3192
|
```javascript
|
3243
|
-
var
|
3244
|
-
|
3245
|
-
firstName: null,
|
3246
|
-
lastName: null,
|
3247
|
-
|
3248
|
-
fullName: function(key, value, oldValue) {
|
3249
|
-
// getter
|
3250
|
-
if (arguments.length === 1) {
|
3251
|
-
var firstName = this.get('firstName');
|
3252
|
-
var lastName = this.get('lastName');
|
3253
|
-
|
3254
|
-
return firstName + ' ' + lastName;
|
3255
|
-
|
3256
|
-
// setter
|
3257
|
-
} else {
|
3258
|
-
var name = value.split(' ');
|
3259
|
-
|
3260
|
-
this.set('firstName', name[0]);
|
3261
|
-
this.set('lastName', name[1]);
|
3262
|
-
|
3263
|
-
return value;
|
3264
|
-
}
|
3265
|
-
}.property('firstName', 'lastName')
|
3193
|
+
var Hamster = Ember.Object.extend({
|
3194
|
+
hasTooManyBananas: Ember.computed.gt('numBananas', 10)
|
3266
3195
|
});
|
3267
3196
|
|
3268
|
-
var
|
3197
|
+
var hamster = Hamster.create();
|
3269
3198
|
|
3270
|
-
|
3271
|
-
|
3272
|
-
|
3199
|
+
hamster.get('hasTooManyBananas'); // false
|
3200
|
+
hamster.set('numBananas', 3);
|
3201
|
+
hamster.get('hasTooManyBananas'); // false
|
3202
|
+
hamster.set('numBananas', 11);
|
3203
|
+
hamster.get('hasTooManyBananas'); // true
|
3273
3204
|
```
|
3274
3205
|
|
3275
|
-
@method
|
3276
|
-
@
|
3277
|
-
@param {
|
3278
|
-
@param {
|
3279
|
-
@return {
|
3206
|
+
@method gt
|
3207
|
+
@for Ember.computed
|
3208
|
+
@param {String} dependentKey
|
3209
|
+
@param {Number} value
|
3210
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3211
|
+
the original value for property is greater than given value.
|
3280
3212
|
@public
|
3281
3213
|
*/
|
3282
|
-
ComputedPropertyPrototype.set = function computedPropertySetEntry(obj, keyName, value) {
|
3283
|
-
if (this._readOnly) {
|
3284
|
-
this._throwReadOnlyError(obj, keyName);
|
3285
|
-
}
|
3286
|
-
|
3287
|
-
if (!this._setter) {
|
3288
|
-
return this.clobberSet(obj, keyName, value);
|
3289
|
-
}
|
3290
3214
|
|
3291
|
-
|
3292
|
-
|
3293
|
-
|
3294
|
-
|
3295
|
-
|
3296
|
-
};
|
3297
|
-
|
3298
|
-
ComputedPropertyPrototype._throwReadOnlyError = function computedPropertyThrowReadOnlyError(obj, keyName) {
|
3299
|
-
throw new _emberMetalError.default('Cannot set read-only property "' + keyName + '" on object: ' + _emberMetalUtils.inspect(obj));
|
3300
|
-
};
|
3301
|
-
|
3302
|
-
ComputedPropertyPrototype.clobberSet = function computedPropertyClobberSet(obj, keyName, value) {
|
3303
|
-
var cachedValue = cacheFor(obj, keyName);
|
3304
|
-
_emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
|
3305
|
-
_emberMetalProperty_set.set(obj, keyName, value);
|
3306
|
-
return value;
|
3307
|
-
};
|
3308
|
-
|
3309
|
-
ComputedPropertyPrototype.volatileSet = function computedPropertyVolatileSet(obj, keyName, value) {
|
3310
|
-
return this._setter.call(obj, keyName, value);
|
3311
|
-
};
|
3312
|
-
|
3313
|
-
ComputedPropertyPrototype.setWithSuspend = function computedPropertySetWithSuspend(obj, keyName, value) {
|
3314
|
-
var oldSuspended = this._suspended;
|
3315
|
-
this._suspended = obj;
|
3316
|
-
try {
|
3317
|
-
return this._set(obj, keyName, value);
|
3318
|
-
} finally {
|
3319
|
-
this._suspended = oldSuspended;
|
3320
|
-
}
|
3321
|
-
};
|
3322
|
-
|
3323
|
-
ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
|
3324
|
-
// cache requires own meta
|
3325
|
-
var meta = metaFor(obj);
|
3326
|
-
// either there is a writable cache or we need one to update
|
3327
|
-
var cache = meta.writableCache();
|
3328
|
-
var hadCachedValue = false;
|
3329
|
-
var cachedValue = undefined;
|
3330
|
-
if (cache[keyName] !== undefined) {
|
3331
|
-
if (cache[keyName] !== UNDEFINED) {
|
3332
|
-
cachedValue = cache[keyName];
|
3333
|
-
}
|
3334
|
-
hadCachedValue = true;
|
3335
|
-
}
|
3336
|
-
|
3337
|
-
var ret = this._setter.call(obj, keyName, value, cachedValue);
|
3338
|
-
|
3339
|
-
// allows setter to return the same value that is cached already
|
3340
|
-
if (hadCachedValue && cachedValue === ret) {
|
3341
|
-
return ret;
|
3342
|
-
}
|
3343
|
-
|
3344
|
-
var watched = meta.peekWatching(keyName);
|
3345
|
-
if (watched) {
|
3346
|
-
_emberMetalProperty_events.propertyWillChange(obj, keyName);
|
3347
|
-
}
|
3348
|
-
|
3349
|
-
if (hadCachedValue) {
|
3350
|
-
cache[keyName] = undefined;
|
3351
|
-
}
|
3352
|
-
|
3353
|
-
if (!hadCachedValue) {
|
3354
|
-
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
3355
|
-
}
|
3356
|
-
|
3357
|
-
if (ret === undefined) {
|
3358
|
-
cache[keyName] = UNDEFINED;
|
3359
|
-
} else {
|
3360
|
-
cache[keyName] = ret;
|
3361
|
-
}
|
3362
|
-
|
3363
|
-
if (watched) {
|
3364
|
-
_emberMetalProperty_events.propertyDidChange(obj, keyName);
|
3365
|
-
}
|
3366
|
-
|
3367
|
-
return ret;
|
3368
|
-
};
|
3369
|
-
|
3370
|
-
/* called before property is overridden */
|
3371
|
-
ComputedPropertyPrototype.teardown = function (obj, keyName) {
|
3372
|
-
if (this._volatile) {
|
3373
|
-
return;
|
3374
|
-
}
|
3375
|
-
var meta = metaFor(obj);
|
3376
|
-
var cache = meta.readableCache();
|
3377
|
-
if (cache && cache[keyName] !== undefined) {
|
3378
|
-
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
3379
|
-
cache[keyName] = undefined;
|
3380
|
-
}
|
3381
|
-
};
|
3215
|
+
function gt(dependentKey, value) {
|
3216
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3217
|
+
return _emberMetalProperty_get.get(this, dependentKey) > value;
|
3218
|
+
});
|
3219
|
+
}
|
3382
3220
|
|
3383
3221
|
/**
|
3384
|
-
|
3385
|
-
|
3386
|
-
with mixins or via `Ember.defineProperty()`.
|
3387
|
-
|
3388
|
-
The function you pass will be used to both get and set property values.
|
3389
|
-
The function should accept two parameters, key and value. If value is not
|
3390
|
-
undefined you should set the value first. In either case return the
|
3391
|
-
current value of the property.
|
3392
|
-
|
3393
|
-
A computed property defined in this way might look like this:
|
3222
|
+
A computed property that returns true if the provided dependent property
|
3223
|
+
is greater than or equal to the provided value.
|
3394
3224
|
|
3395
|
-
|
3396
|
-
var Person = Ember.Object.extend({
|
3397
|
-
firstName: 'Betty',
|
3398
|
-
lastName: 'Jones',
|
3225
|
+
Example
|
3399
3226
|
|
3400
|
-
|
3401
|
-
|
3402
|
-
|
3227
|
+
```javascript
|
3228
|
+
var Hamster = Ember.Object.extend({
|
3229
|
+
hasTooManyBananas: Ember.computed.gte('numBananas', 10)
|
3403
3230
|
});
|
3404
3231
|
|
3405
|
-
var
|
3406
|
-
|
3407
|
-
client.get('fullName'); // 'Betty Jones'
|
3408
|
-
|
3409
|
-
client.set('lastName', 'Fuller');
|
3410
|
-
client.get('fullName'); // 'Betty Fuller'
|
3411
|
-
```
|
3412
|
-
|
3413
|
-
_Note: This is the preferred way to define computed properties when writing third-party
|
3414
|
-
libraries that depend on or use Ember, since there is no guarantee that the user
|
3415
|
-
will have prototype extensions enabled._
|
3416
|
-
|
3417
|
-
You might use this method if you disabled
|
3418
|
-
[Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
|
3419
|
-
The alternative syntax might look like this
|
3420
|
-
(if prototype extensions are enabled, which is the default behavior):
|
3232
|
+
var hamster = Hamster.create();
|
3421
3233
|
|
3422
|
-
|
3423
|
-
|
3424
|
-
|
3425
|
-
|
3234
|
+
hamster.get('hasTooManyBananas'); // false
|
3235
|
+
hamster.set('numBananas', 3);
|
3236
|
+
hamster.get('hasTooManyBananas'); // false
|
3237
|
+
hamster.set('numBananas', 10);
|
3238
|
+
hamster.get('hasTooManyBananas'); // true
|
3426
3239
|
```
|
3427
3240
|
|
3428
|
-
@
|
3429
|
-
@
|
3430
|
-
@
|
3431
|
-
@
|
3432
|
-
@
|
3433
|
-
|
3434
|
-
@return {Ember.ComputedProperty} property descriptor instance
|
3241
|
+
@method gte
|
3242
|
+
@for Ember.computed
|
3243
|
+
@param {String} dependentKey
|
3244
|
+
@param {Number} value
|
3245
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3246
|
+
the original value for property is greater or equal then given value.
|
3435
3247
|
@public
|
3436
3248
|
*/
|
3437
3249
|
|
3438
|
-
function
|
3439
|
-
|
3440
|
-
|
3441
|
-
|
3442
|
-
args = [].slice.call(arguments);
|
3443
|
-
func = args.pop();
|
3444
|
-
}
|
3445
|
-
|
3446
|
-
var cp = new ComputedProperty(func);
|
3447
|
-
|
3448
|
-
if (args) {
|
3449
|
-
cp.property.apply(cp, args);
|
3450
|
-
}
|
3451
|
-
|
3452
|
-
return cp;
|
3250
|
+
function gte(dependentKey, value) {
|
3251
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3252
|
+
return _emberMetalProperty_get.get(this, dependentKey) >= value;
|
3253
|
+
});
|
3453
3254
|
}
|
3454
3255
|
|
3455
3256
|
/**
|
3456
|
-
|
3457
|
-
|
3458
|
-
property that is generated lazily, without accidentally causing
|
3459
|
-
it to be created.
|
3257
|
+
A computed property that returns true if the provided dependent property
|
3258
|
+
is less than the provided value.
|
3460
3259
|
|
3461
|
-
|
3462
|
-
|
3463
|
-
|
3464
|
-
|
3465
|
-
|
3466
|
-
|
3260
|
+
Example
|
3261
|
+
|
3262
|
+
```javascript
|
3263
|
+
var Hamster = Ember.Object.extend({
|
3264
|
+
needsMoreBananas: Ember.computed.lt('numBananas', 3)
|
3265
|
+
});
|
3266
|
+
|
3267
|
+
var hamster = Hamster.create();
|
3268
|
+
|
3269
|
+
hamster.get('needsMoreBananas'); // true
|
3270
|
+
hamster.set('numBananas', 3);
|
3271
|
+
hamster.get('needsMoreBananas'); // false
|
3272
|
+
hamster.set('numBananas', 2);
|
3273
|
+
hamster.get('needsMoreBananas'); // true
|
3274
|
+
```
|
3275
|
+
|
3276
|
+
@method lt
|
3277
|
+
@for Ember.computed
|
3278
|
+
@param {String} dependentKey
|
3279
|
+
@param {Number} value
|
3280
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3281
|
+
the original value for property is less then given value.
|
3467
3282
|
@public
|
3468
3283
|
*/
|
3469
|
-
function cacheFor(obj, key) {
|
3470
|
-
var meta = obj.__ember_meta__;
|
3471
|
-
var cache = meta && meta.source === obj && meta.readableCache();
|
3472
|
-
var ret = cache && cache[key];
|
3473
3284
|
|
3474
|
-
|
3475
|
-
|
3476
|
-
|
3477
|
-
|
3478
|
-
}
|
3479
|
-
|
3480
|
-
cacheFor.set = function (cache, key, value) {
|
3481
|
-
if (value === undefined) {
|
3482
|
-
cache[key] = UNDEFINED;
|
3483
|
-
} else {
|
3484
|
-
cache[key] = value;
|
3485
|
-
}
|
3486
|
-
};
|
3487
|
-
|
3488
|
-
cacheFor.get = function (cache, key) {
|
3489
|
-
var ret = cache[key];
|
3490
|
-
if (ret === UNDEFINED) {
|
3491
|
-
return undefined;
|
3492
|
-
}
|
3493
|
-
return ret;
|
3494
|
-
};
|
3495
|
-
|
3496
|
-
cacheFor.remove = function (cache, key) {
|
3497
|
-
cache[key] = undefined;
|
3498
|
-
};
|
3499
|
-
|
3500
|
-
exports.ComputedProperty = ComputedProperty;
|
3501
|
-
exports.computed = computed;
|
3502
|
-
exports.cacheFor = cacheFor;
|
3503
|
-
});
|
3504
|
-
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) {
|
3505
|
-
'use strict';
|
3506
|
-
|
3507
|
-
exports.empty = empty;
|
3508
|
-
exports.notEmpty = notEmpty;
|
3509
|
-
exports.none = none;
|
3510
|
-
exports.not = not;
|
3511
|
-
exports.bool = bool;
|
3512
|
-
exports.match = match;
|
3513
|
-
exports.equal = equal;
|
3514
|
-
exports.gt = gt;
|
3515
|
-
exports.gte = gte;
|
3516
|
-
exports.lt = lt;
|
3517
|
-
exports.lte = lte;
|
3518
|
-
exports.oneWay = oneWay;
|
3519
|
-
exports.readOnly = readOnly;
|
3520
|
-
exports.deprecatingAlias = deprecatingAlias;
|
3521
|
-
|
3522
|
-
/**
|
3523
|
-
@module ember
|
3524
|
-
@submodule ember-metal
|
3525
|
-
*/
|
3526
|
-
|
3527
|
-
function getProperties(self, propertyNames) {
|
3528
|
-
var ret = {};
|
3529
|
-
for (var i = 0; i < propertyNames.length; i++) {
|
3530
|
-
ret[propertyNames[i]] = _emberMetalProperty_get.get(self, propertyNames[i]);
|
3531
|
-
}
|
3532
|
-
return ret;
|
3533
|
-
}
|
3534
|
-
|
3535
|
-
function generateComputedWithProperties(macro) {
|
3536
|
-
return function () {
|
3537
|
-
for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
|
3538
|
-
properties[_key] = arguments[_key];
|
3539
|
-
}
|
3540
|
-
|
3541
|
-
var computedFunc = _emberMetalComputed.computed(function () {
|
3542
|
-
return macro.apply(this, [getProperties(this, properties)]);
|
3543
|
-
});
|
3544
|
-
|
3545
|
-
return computedFunc.property.apply(computedFunc, properties);
|
3546
|
-
};
|
3285
|
+
function lt(dependentKey, value) {
|
3286
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3287
|
+
return _emberMetalProperty_get.get(this, dependentKey) < value;
|
3288
|
+
});
|
3547
3289
|
}
|
3548
3290
|
|
3549
3291
|
/**
|
3550
|
-
A computed property that returns true if the
|
3551
|
-
|
3292
|
+
A computed property that returns true if the provided dependent property
|
3293
|
+
is less than or equal to the provided value.
|
3552
3294
|
|
3553
3295
|
Example
|
3554
3296
|
|
3555
3297
|
```javascript
|
3556
|
-
var
|
3557
|
-
|
3298
|
+
var Hamster = Ember.Object.extend({
|
3299
|
+
needsMoreBananas: Ember.computed.lte('numBananas', 3)
|
3558
3300
|
});
|
3559
3301
|
|
3560
|
-
var
|
3561
|
-
todos: ['Unit Test', 'Documentation', 'Release']
|
3562
|
-
});
|
3302
|
+
var hamster = Hamster.create();
|
3563
3303
|
|
3564
|
-
|
3565
|
-
|
3566
|
-
|
3304
|
+
hamster.get('needsMoreBananas'); // true
|
3305
|
+
hamster.set('numBananas', 5);
|
3306
|
+
hamster.get('needsMoreBananas'); // false
|
3307
|
+
hamster.set('numBananas', 3);
|
3308
|
+
hamster.get('needsMoreBananas'); // true
|
3567
3309
|
```
|
3568
3310
|
|
3569
|
-
@
|
3570
|
-
@method empty
|
3311
|
+
@method lte
|
3571
3312
|
@for Ember.computed
|
3572
3313
|
@param {String} dependentKey
|
3573
|
-
@
|
3574
|
-
|
3314
|
+
@param {Number} value
|
3315
|
+
@return {Ember.ComputedProperty} computed property which returns true if
|
3316
|
+
the original value for property is less or equal than given value.
|
3575
3317
|
@public
|
3576
3318
|
*/
|
3577
3319
|
|
3578
|
-
function
|
3579
|
-
return _emberMetalComputed.computed(dependentKey
|
3580
|
-
return
|
3320
|
+
function lte(dependentKey, value) {
|
3321
|
+
return _emberMetalComputed.computed(dependentKey, function () {
|
3322
|
+
return _emberMetalProperty_get.get(this, dependentKey) <= value;
|
3581
3323
|
});
|
3582
3324
|
}
|
3583
3325
|
|
3584
3326
|
/**
|
3585
|
-
A computed property that
|
3586
|
-
|
3327
|
+
A computed property that performs a logical `and` on the
|
3328
|
+
original values for the provided dependent properties.
|
3587
3329
|
|
3588
3330
|
Example
|
3589
3331
|
|
3590
3332
|
```javascript
|
3591
3333
|
var Hamster = Ember.Object.extend({
|
3592
|
-
|
3334
|
+
readyForCamp: Ember.computed.and('hasTent', 'hasBackpack')
|
3593
3335
|
});
|
3594
3336
|
|
3595
|
-
var hamster = Hamster.create(
|
3337
|
+
var hamster = Hamster.create();
|
3596
3338
|
|
3597
|
-
hamster.get('
|
3598
|
-
hamster.
|
3599
|
-
hamster.get('
|
3339
|
+
hamster.get('readyForCamp'); // false
|
3340
|
+
hamster.set('hasTent', true);
|
3341
|
+
hamster.get('readyForCamp'); // false
|
3342
|
+
hamster.set('hasBackpack', true);
|
3343
|
+
hamster.get('readyForCamp'); // true
|
3344
|
+
hamster.set('hasBackpack', 'Yes');
|
3345
|
+
hamster.get('readyForCamp'); // 'Yes'
|
3600
3346
|
```
|
3601
3347
|
|
3602
|
-
@method
|
3348
|
+
@method and
|
3603
3349
|
@for Ember.computed
|
3604
|
-
@param {String} dependentKey
|
3605
|
-
@return {Ember.ComputedProperty} computed property which
|
3606
|
-
|
3350
|
+
@param {String} dependentKey*
|
3351
|
+
@return {Ember.ComputedProperty} computed property which performs
|
3352
|
+
a logical `and` on the values of all the original values for properties.
|
3607
3353
|
@public
|
3608
3354
|
*/
|
3355
|
+
var and = generateComputedWithProperties(function (properties) {
|
3356
|
+
var value;
|
3357
|
+
for (var key in properties) {
|
3358
|
+
value = properties[key];
|
3359
|
+
if (properties.hasOwnProperty(key) && !value) {
|
3360
|
+
return false;
|
3361
|
+
}
|
3362
|
+
}
|
3363
|
+
return value;
|
3364
|
+
});
|
3609
3365
|
|
3610
|
-
|
3611
|
-
return _emberMetalComputed.computed(dependentKey + '.length', function () {
|
3612
|
-
return !_emberMetalIs_empty.default(_emberMetalProperty_get.get(this, dependentKey));
|
3613
|
-
});
|
3614
|
-
}
|
3615
|
-
|
3366
|
+
exports.and = and;
|
3616
3367
|
/**
|
3617
|
-
A computed property
|
3618
|
-
|
3619
|
-
about use of ==, which can be technically confusing.
|
3368
|
+
A computed property which performs a logical `or` on the
|
3369
|
+
original values for the provided dependent properties.
|
3620
3370
|
|
3621
3371
|
Example
|
3622
3372
|
|
3623
3373
|
```javascript
|
3624
3374
|
var Hamster = Ember.Object.extend({
|
3625
|
-
|
3375
|
+
readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
|
3626
3376
|
});
|
3627
3377
|
|
3628
3378
|
var hamster = Hamster.create();
|
3629
3379
|
|
3630
|
-
hamster.get('
|
3631
|
-
hamster.set('
|
3632
|
-
hamster.get('
|
3633
|
-
hamster.set('
|
3634
|
-
hamster.get('
|
3380
|
+
hamster.get('readyForRain'); // false
|
3381
|
+
hamster.set('hasUmbrella', true);
|
3382
|
+
hamster.get('readyForRain'); // true
|
3383
|
+
hamster.set('hasJacket', 'Yes');
|
3384
|
+
hamster.get('readyForRain'); // 'Yes'
|
3635
3385
|
```
|
3636
3386
|
|
3637
|
-
@method
|
3387
|
+
@method or
|
3638
3388
|
@for Ember.computed
|
3639
|
-
@param {String} dependentKey
|
3640
|
-
@return {Ember.ComputedProperty} computed property which
|
3641
|
-
|
3389
|
+
@param {String} dependentKey*
|
3390
|
+
@return {Ember.ComputedProperty} computed property which performs
|
3391
|
+
a logical `or` on the values of all the original values for properties.
|
3642
3392
|
@public
|
3643
3393
|
*/
|
3394
|
+
var or = generateComputedWithProperties(function (properties) {
|
3395
|
+
var value;
|
3396
|
+
for (var key in properties) {
|
3397
|
+
value = properties[key];
|
3398
|
+
if (properties.hasOwnProperty(key) && value) {
|
3399
|
+
return value;
|
3400
|
+
}
|
3401
|
+
}
|
3402
|
+
return value;
|
3403
|
+
});
|
3644
3404
|
|
3645
|
-
|
3646
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
3647
|
-
return _emberMetalIs_none.default(_emberMetalProperty_get.get(this, dependentKey));
|
3648
|
-
});
|
3649
|
-
}
|
3650
|
-
|
3405
|
+
exports.or = or;
|
3651
3406
|
/**
|
3652
|
-
A computed property that returns the
|
3653
|
-
|
3407
|
+
A computed property that returns the array of values
|
3408
|
+
for the provided dependent properties.
|
3654
3409
|
|
3655
3410
|
Example
|
3656
3411
|
|
3657
3412
|
```javascript
|
3658
|
-
var
|
3659
|
-
|
3413
|
+
var Hamster = Ember.Object.extend({
|
3414
|
+
clothes: Ember.computed.collect('hat', 'shirt')
|
3660
3415
|
});
|
3661
3416
|
|
3662
|
-
var
|
3417
|
+
var hamster = Hamster.create();
|
3663
3418
|
|
3664
|
-
|
3665
|
-
|
3666
|
-
|
3419
|
+
hamster.get('clothes'); // [null, null]
|
3420
|
+
hamster.set('hat', 'Camp Hat');
|
3421
|
+
hamster.set('shirt', 'Camp Shirt');
|
3422
|
+
hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
|
3667
3423
|
```
|
3668
3424
|
|
3669
|
-
@method
|
3425
|
+
@method collect
|
3670
3426
|
@for Ember.computed
|
3671
|
-
@param {String} dependentKey
|
3672
|
-
@return {Ember.ComputedProperty} computed property which
|
3673
|
-
|
3427
|
+
@param {String} dependentKey*
|
3428
|
+
@return {Ember.ComputedProperty} computed property which maps
|
3429
|
+
values of all passed in properties to an array.
|
3674
3430
|
@public
|
3675
3431
|
*/
|
3432
|
+
var collect = generateComputedWithProperties(function (properties) {
|
3433
|
+
var res = _emberMetalCore.default.A();
|
3434
|
+
for (var key in properties) {
|
3435
|
+
if (properties.hasOwnProperty(key)) {
|
3436
|
+
if (_emberMetalIs_none.default(properties[key])) {
|
3437
|
+
res.push(null);
|
3438
|
+
} else {
|
3439
|
+
res.push(properties[key]);
|
3440
|
+
}
|
3441
|
+
}
|
3442
|
+
}
|
3443
|
+
return res;
|
3444
|
+
});
|
3676
3445
|
|
3677
|
-
|
3678
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
3679
|
-
return !_emberMetalProperty_get.get(this, dependentKey);
|
3680
|
-
});
|
3681
|
-
}
|
3682
|
-
|
3446
|
+
exports.collect = collect;
|
3683
3447
|
/**
|
3684
|
-
|
3685
|
-
|
3448
|
+
Creates a new property that is an alias for another property
|
3449
|
+
on an object. Calls to `get` or `set` this property behave as
|
3450
|
+
though they were called on the original property.
|
3686
3451
|
|
3687
3452
|
```javascript
|
3688
|
-
var
|
3689
|
-
|
3453
|
+
var Person = Ember.Object.extend({
|
3454
|
+
name: 'Alex Matchneer',
|
3455
|
+
nomen: Ember.computed.alias('name')
|
3690
3456
|
});
|
3691
3457
|
|
3692
|
-
var
|
3458
|
+
var alex = Person.create();
|
3693
3459
|
|
3694
|
-
|
3695
|
-
|
3696
|
-
|
3697
|
-
|
3698
|
-
|
3699
|
-
hamster.set('numBananas', null);
|
3700
|
-
hamster.get('hasBananas'); // false
|
3460
|
+
alex.get('nomen'); // 'Alex Matchneer'
|
3461
|
+
alex.get('name'); // 'Alex Matchneer'
|
3462
|
+
|
3463
|
+
alex.set('nomen', '@machty');
|
3464
|
+
alex.get('name'); // '@machty'
|
3701
3465
|
```
|
3702
3466
|
|
3703
|
-
@method
|
3467
|
+
@method alias
|
3704
3468
|
@for Ember.computed
|
3705
3469
|
@param {String} dependentKey
|
3706
|
-
@return {Ember.ComputedProperty} computed property which
|
3707
|
-
to
|
3470
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
3471
|
+
alias to the original value for property.
|
3708
3472
|
@public
|
3709
3473
|
*/
|
3710
3474
|
|
3711
|
-
function bool(dependentKey) {
|
3712
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
3713
|
-
return !!_emberMetalProperty_get.get(this, dependentKey);
|
3714
|
-
});
|
3715
|
-
}
|
3716
|
-
|
3717
3475
|
/**
|
3718
|
-
|
3719
|
-
|
3720
|
-
|
3476
|
+
Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
|
3477
|
+
data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
|
3478
|
+
not mutate the upstream property, rather causes the current property to
|
3479
|
+
become the value set. This causes the downstream property to permanently
|
3480
|
+
diverge from the upstream property.
|
3721
3481
|
|
3722
3482
|
Example
|
3723
3483
|
|
3724
3484
|
```javascript
|
3725
3485
|
var User = Ember.Object.extend({
|
3726
|
-
|
3486
|
+
firstName: null,
|
3487
|
+
lastName: null,
|
3488
|
+
nickName: Ember.computed.oneWay('firstName')
|
3727
3489
|
});
|
3728
3490
|
|
3729
|
-
var
|
3491
|
+
var teddy = User.create({
|
3492
|
+
firstName: 'Teddy',
|
3493
|
+
lastName: 'Zeenny'
|
3494
|
+
});
|
3730
3495
|
|
3731
|
-
|
3732
|
-
|
3733
|
-
|
3734
|
-
user.set('email', 'ember_hamster@example.com');
|
3735
|
-
user.get('hasValidEmail'); // true
|
3496
|
+
teddy.get('nickName'); // 'Teddy'
|
3497
|
+
teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
|
3498
|
+
teddy.get('firstName'); // 'Teddy'
|
3736
3499
|
```
|
3737
3500
|
|
3738
|
-
@method
|
3501
|
+
@method oneWay
|
3739
3502
|
@for Ember.computed
|
3740
3503
|
@param {String} dependentKey
|
3741
|
-
@
|
3742
|
-
|
3743
|
-
the original value for property against a given RegExp
|
3504
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3505
|
+
one way computed property to the original value for property.
|
3744
3506
|
@public
|
3745
3507
|
*/
|
3746
3508
|
|
3747
|
-
function
|
3748
|
-
return
|
3749
|
-
var value = _emberMetalProperty_get.get(this, dependentKey);
|
3750
|
-
|
3751
|
-
return typeof value === 'string' ? regexp.test(value) : false;
|
3752
|
-
});
|
3509
|
+
function oneWay(dependentKey) {
|
3510
|
+
return _emberMetalAlias.default(dependentKey).oneWay();
|
3753
3511
|
}
|
3754
3512
|
|
3755
3513
|
/**
|
3756
|
-
|
3757
|
-
is
|
3514
|
+
This is a more semantically meaningful alias of `computed.oneWay`,
|
3515
|
+
whose name is somewhat ambiguous as to which direction the data flows.
|
3516
|
+
|
3517
|
+
@method reads
|
3518
|
+
@for Ember.computed
|
3519
|
+
@param {String} dependentKey
|
3520
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3521
|
+
one way computed property to the original value for property.
|
3522
|
+
@public
|
3523
|
+
*/
|
3524
|
+
|
3525
|
+
/**
|
3526
|
+
Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
|
3527
|
+
a readOnly one way binding. Very often when using `computed.oneWay` one does
|
3528
|
+
not also want changes to propagate back up, as they will replace the value.
|
3529
|
+
|
3530
|
+
This prevents the reverse flow, and also throws an exception when it occurs.
|
3758
3531
|
|
3759
3532
|
Example
|
3760
3533
|
|
3761
3534
|
```javascript
|
3762
|
-
var
|
3763
|
-
|
3535
|
+
var User = Ember.Object.extend({
|
3536
|
+
firstName: null,
|
3537
|
+
lastName: null,
|
3538
|
+
nickName: Ember.computed.readOnly('firstName')
|
3764
3539
|
});
|
3765
3540
|
|
3766
|
-
var
|
3541
|
+
var teddy = User.create({
|
3542
|
+
firstName: 'Teddy',
|
3543
|
+
lastName: 'Zeenny'
|
3544
|
+
});
|
3767
3545
|
|
3768
|
-
|
3769
|
-
|
3770
|
-
|
3771
|
-
|
3772
|
-
hamster.get('napTime'); // false
|
3546
|
+
teddy.get('nickName'); // 'Teddy'
|
3547
|
+
teddy.set('nickName', 'TeddyBear'); // throws Exception
|
3548
|
+
// throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
|
3549
|
+
teddy.get('firstName'); // 'Teddy'
|
3773
3550
|
```
|
3774
3551
|
|
3775
|
-
@method
|
3552
|
+
@method readOnly
|
3776
3553
|
@for Ember.computed
|
3777
3554
|
@param {String} dependentKey
|
3778
|
-
@
|
3779
|
-
|
3780
|
-
|
3555
|
+
@return {Ember.ComputedProperty} computed property which creates a
|
3556
|
+
one way computed property to the original value for property.
|
3557
|
+
@since 1.5.0
|
3781
3558
|
@public
|
3782
3559
|
*/
|
3783
3560
|
|
3784
|
-
function
|
3785
|
-
return
|
3786
|
-
return _emberMetalProperty_get.get(this, dependentKey) === value;
|
3787
|
-
});
|
3561
|
+
function readOnly(dependentKey) {
|
3562
|
+
return _emberMetalAlias.default(dependentKey).readOnly();
|
3788
3563
|
}
|
3789
3564
|
|
3790
3565
|
/**
|
3791
|
-
|
3792
|
-
|
3793
|
-
|
3794
|
-
|
3795
|
-
|
3796
|
-
```javascript
|
3797
|
-
var Hamster = Ember.Object.extend({
|
3798
|
-
hasTooManyBananas: Ember.computed.gt('numBananas', 10)
|
3799
|
-
});
|
3800
|
-
|
3801
|
-
var hamster = Hamster.create();
|
3802
|
-
|
3803
|
-
hamster.get('hasTooManyBananas'); // false
|
3804
|
-
hamster.set('numBananas', 3);
|
3805
|
-
hamster.get('hasTooManyBananas'); // false
|
3806
|
-
hamster.set('numBananas', 11);
|
3807
|
-
hamster.get('hasTooManyBananas'); // true
|
3808
|
-
```
|
3566
|
+
Creates a new property that is an alias for another property
|
3567
|
+
on an object. Calls to `get` or `set` this property behave as
|
3568
|
+
though they were called on the original property, but also
|
3569
|
+
print a deprecation warning.
|
3809
3570
|
|
3810
|
-
@method
|
3571
|
+
@method deprecatingAlias
|
3811
3572
|
@for Ember.computed
|
3812
3573
|
@param {String} dependentKey
|
3813
|
-
@
|
3814
|
-
|
3815
|
-
|
3574
|
+
@return {Ember.ComputedProperty} computed property which creates an
|
3575
|
+
alias with a deprecation to the original value for property.
|
3576
|
+
@since 1.7.0
|
3816
3577
|
@public
|
3817
3578
|
*/
|
3818
3579
|
|
3819
|
-
function
|
3820
|
-
return _emberMetalComputed.computed(dependentKey,
|
3821
|
-
|
3580
|
+
function deprecatingAlias(dependentKey, options) {
|
3581
|
+
return _emberMetalComputed.computed(dependentKey, {
|
3582
|
+
get: function (key) {
|
3583
|
+
_emberMetalCore.default.deprecate('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options);
|
3584
|
+
return _emberMetalProperty_get.get(this, dependentKey);
|
3585
|
+
},
|
3586
|
+
set: function (key, value) {
|
3587
|
+
_emberMetalCore.default.deprecate('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options);
|
3588
|
+
_emberMetalProperty_set.set(this, dependentKey, value);
|
3589
|
+
return value;
|
3590
|
+
}
|
3822
3591
|
});
|
3823
3592
|
}
|
3593
|
+
});
|
3594
|
+
enifed('ember-metal/computed', ['exports', 'ember-metal/core', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/property_events', 'ember-metal/dependent_keys'], function (exports, _emberMetalCore, _emberMetalProperty_set, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) {
|
3595
|
+
'use strict';
|
3596
|
+
|
3597
|
+
exports.default = computed;
|
3824
3598
|
|
3825
3599
|
/**
|
3826
|
-
|
3827
|
-
|
3600
|
+
@module ember
|
3601
|
+
@submodule ember-metal
|
3602
|
+
*/
|
3603
|
+
|
3604
|
+
var metaFor = _emberMetalMeta.meta;
|
3605
|
+
|
3606
|
+
function UNDEFINED() {}
|
3607
|
+
|
3608
|
+
// ..........................................................
|
3609
|
+
// COMPUTED PROPERTY
|
3610
|
+
//
|
3611
|
+
|
3612
|
+
/**
|
3613
|
+
A computed property transforms an object's function into a property.
|
3828
3614
|
|
3829
|
-
|
3615
|
+
By default the function backing the computed property will only be called
|
3616
|
+
once and the result will be cached. You can specify various properties
|
3617
|
+
that your computed property depends on. This will force the cached
|
3618
|
+
result to be recomputed if the dependencies are modified.
|
3619
|
+
|
3620
|
+
In the following example we declare a computed property (by calling
|
3621
|
+
`.property()` on the fullName function) and setup the property
|
3622
|
+
dependencies (depending on firstName and lastName). The fullName function
|
3623
|
+
will be called once (regardless of how many times it is accessed) as long
|
3624
|
+
as its dependencies have not changed. Once firstName or lastName are updated
|
3625
|
+
any future calls (or anything bound) to fullName will incorporate the new
|
3626
|
+
values.
|
3830
3627
|
|
3831
3628
|
```javascript
|
3832
|
-
var
|
3833
|
-
|
3834
|
-
|
3629
|
+
var Person = Ember.Object.extend({
|
3630
|
+
// these will be supplied by `create`
|
3631
|
+
firstName: null,
|
3632
|
+
lastName: null,
|
3835
3633
|
|
3836
|
-
|
3634
|
+
fullName: function() {
|
3635
|
+
var firstName = this.get('firstName');
|
3636
|
+
var lastName = this.get('lastName');
|
3837
3637
|
|
3838
|
-
|
3839
|
-
|
3840
|
-
|
3841
|
-
hamster.set('numBananas', 10);
|
3842
|
-
hamster.get('hasTooManyBananas'); // true
|
3843
|
-
```
|
3638
|
+
return firstName + ' ' + lastName;
|
3639
|
+
}.property('firstName', 'lastName')
|
3640
|
+
});
|
3844
3641
|
|
3845
|
-
|
3846
|
-
|
3847
|
-
|
3848
|
-
@param {Number} value
|
3849
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
3850
|
-
the original value for property is greater or equal then given value.
|
3851
|
-
@public
|
3852
|
-
*/
|
3853
|
-
|
3854
|
-
function gte(dependentKey, value) {
|
3855
|
-
return _emberMetalComputed.computed(dependentKey, function () {
|
3856
|
-
return _emberMetalProperty_get.get(this, dependentKey) >= value;
|
3642
|
+
var tom = Person.create({
|
3643
|
+
firstName: 'Tom',
|
3644
|
+
lastName: 'Dale'
|
3857
3645
|
});
|
3858
|
-
}
|
3859
|
-
|
3860
|
-
/**
|
3861
|
-
A computed property that returns true if the provided dependent property
|
3862
|
-
is less than the provided value.
|
3863
3646
|
|
3864
|
-
|
3647
|
+
tom.get('fullName') // 'Tom Dale'
|
3648
|
+
```
|
3649
|
+
|
3650
|
+
You can also define what Ember should do when setting a computed property.
|
3651
|
+
If you try to set a computed property, it will be invoked with the key and
|
3652
|
+
value you want to set it to. You can also accept the previous value as the
|
3653
|
+
third parameter.
|
3865
3654
|
|
3866
3655
|
```javascript
|
3867
|
-
var
|
3868
|
-
|
3656
|
+
var Person = Ember.Object.extend({
|
3657
|
+
// these will be supplied by `create`
|
3658
|
+
firstName: null,
|
3659
|
+
lastName: null,
|
3660
|
+
|
3661
|
+
fullName: function(key, value, oldValue) {
|
3662
|
+
// getter
|
3663
|
+
if (arguments.length === 1) {
|
3664
|
+
var firstName = this.get('firstName');
|
3665
|
+
var lastName = this.get('lastName');
|
3666
|
+
|
3667
|
+
return firstName + ' ' + lastName;
|
3668
|
+
|
3669
|
+
// setter
|
3670
|
+
} else {
|
3671
|
+
var name = value.split(' ');
|
3672
|
+
|
3673
|
+
this.set('firstName', name[0]);
|
3674
|
+
this.set('lastName', name[1]);
|
3675
|
+
|
3676
|
+
return value;
|
3677
|
+
}
|
3678
|
+
}.property('firstName', 'lastName')
|
3869
3679
|
});
|
3870
3680
|
|
3871
|
-
var
|
3681
|
+
var person = Person.create();
|
3872
3682
|
|
3873
|
-
|
3874
|
-
|
3875
|
-
|
3876
|
-
hamster.set('numBananas', 2);
|
3877
|
-
hamster.get('needsMoreBananas'); // true
|
3683
|
+
person.set('fullName', 'Peter Wagenet');
|
3684
|
+
person.get('firstName'); // 'Peter'
|
3685
|
+
person.get('lastName'); // 'Wagenet'
|
3878
3686
|
```
|
3879
3687
|
|
3880
|
-
@
|
3881
|
-
@
|
3882
|
-
@
|
3883
|
-
@param {Number} value
|
3884
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
3885
|
-
the original value for property is less then given value.
|
3688
|
+
@class ComputedProperty
|
3689
|
+
@namespace Ember
|
3690
|
+
@constructor
|
3886
3691
|
@public
|
3887
3692
|
*/
|
3888
|
-
|
3889
|
-
|
3890
|
-
|
3891
|
-
|
3892
|
-
}
|
3693
|
+
function ComputedProperty(config, opts) {
|
3694
|
+
this.isDescriptor = true;
|
3695
|
+
if (typeof config === 'function') {
|
3696
|
+
this._getter = config;
|
3697
|
+
} else {
|
3698
|
+
_emberMetalCore.default.assert('Ember.computed expects a function or an object as last argument.', typeof config === 'object' && !Array.isArray(config));
|
3699
|
+
_emberMetalCore.default.assert('Config object pased to a Ember.computed can only contain `get` or `set` keys.', (function () {
|
3700
|
+
var keys = Object.keys(config);
|
3701
|
+
for (var i = 0; i < keys.length; i++) {
|
3702
|
+
if (keys[i] !== 'get' && keys[i] !== 'set') {
|
3703
|
+
return false;
|
3704
|
+
}
|
3705
|
+
}
|
3706
|
+
return true;
|
3707
|
+
})());
|
3708
|
+
this._getter = config.get;
|
3709
|
+
this._setter = config.set;
|
3710
|
+
}
|
3711
|
+
_emberMetalCore.default.assert('Computed properties must receive a getter or a setter, you passed none.', !!this._getter || !!this._setter);
|
3712
|
+
this._dependentKeys = undefined;
|
3713
|
+
this._suspended = undefined;
|
3714
|
+
this._meta = undefined;
|
3715
|
+
this._volatile = false;
|
3716
|
+
this._dependentKeys = opts && opts.dependentKeys;
|
3717
|
+
this._readOnly = false;
|
3893
3718
|
}
|
3894
3719
|
|
3720
|
+
ComputedProperty.prototype = new _emberMetalProperties.Descriptor();
|
3721
|
+
|
3722
|
+
var ComputedPropertyPrototype = ComputedProperty.prototype;
|
3723
|
+
|
3724
|
+
/**
|
3725
|
+
Call on a computed property to set it into non-cached mode. When in this
|
3726
|
+
mode the computed property will not automatically cache the return value.
|
3727
|
+
|
3728
|
+
It also does not automatically fire any change events. You must manually notify
|
3729
|
+
any changes if you want to observe this property.
|
3730
|
+
|
3731
|
+
Dependency keys have no effect on volatile properties as they are for cache
|
3732
|
+
invalidation and notification when cached value is invalidated.
|
3733
|
+
|
3734
|
+
```javascript
|
3735
|
+
var outsideService = Ember.Object.extend({
|
3736
|
+
value: function() {
|
3737
|
+
return OutsideService.getValue();
|
3738
|
+
}.property().volatile()
|
3739
|
+
}).create();
|
3740
|
+
```
|
3741
|
+
|
3742
|
+
@method volatile
|
3743
|
+
@return {Ember.ComputedProperty} this
|
3744
|
+
@chainable
|
3745
|
+
@public
|
3746
|
+
*/
|
3747
|
+
ComputedPropertyPrototype.volatile = function () {
|
3748
|
+
this._volatile = true;
|
3749
|
+
return this;
|
3750
|
+
};
|
3751
|
+
|
3895
3752
|
/**
|
3896
|
-
|
3897
|
-
|
3898
|
-
|
3899
|
-
Example
|
3753
|
+
Call on a computed property to set it into read-only mode. When in this
|
3754
|
+
mode the computed property will throw an error when set.
|
3900
3755
|
|
3901
3756
|
```javascript
|
3902
|
-
var
|
3903
|
-
|
3757
|
+
var Person = Ember.Object.extend({
|
3758
|
+
guid: function() {
|
3759
|
+
return 'guid-guid-guid';
|
3760
|
+
}.property().readOnly()
|
3904
3761
|
});
|
3905
3762
|
|
3906
|
-
var
|
3763
|
+
var person = Person.create();
|
3907
3764
|
|
3908
|
-
|
3909
|
-
hamster.set('numBananas', 5);
|
3910
|
-
hamster.get('needsMoreBananas'); // false
|
3911
|
-
hamster.set('numBananas', 3);
|
3912
|
-
hamster.get('needsMoreBananas'); // true
|
3765
|
+
person.set('guid', 'new-guid'); // will throw an exception
|
3913
3766
|
```
|
3914
3767
|
|
3915
|
-
@method
|
3916
|
-
@
|
3917
|
-
@
|
3918
|
-
@param {Number} value
|
3919
|
-
@return {Ember.ComputedProperty} computed property which returns true if
|
3920
|
-
the original value for property is less or equal than given value.
|
3768
|
+
@method readOnly
|
3769
|
+
@return {Ember.ComputedProperty} this
|
3770
|
+
@chainable
|
3921
3771
|
@public
|
3922
3772
|
*/
|
3923
|
-
|
3924
|
-
|
3925
|
-
|
3926
|
-
|
3927
|
-
|
3928
|
-
}
|
3773
|
+
ComputedPropertyPrototype.readOnly = function () {
|
3774
|
+
this._readOnly = true;
|
3775
|
+
_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));
|
3776
|
+
return this;
|
3777
|
+
};
|
3929
3778
|
|
3930
3779
|
/**
|
3931
|
-
|
3932
|
-
|
3933
|
-
|
3934
|
-
Example
|
3780
|
+
Sets the dependent keys on this computed property. Pass any number of
|
3781
|
+
arguments containing key paths that this computed property depends on.
|
3935
3782
|
|
3936
3783
|
```javascript
|
3937
|
-
var
|
3938
|
-
|
3784
|
+
var President = Ember.Object.extend({
|
3785
|
+
fullName: computed(function() {
|
3786
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
3787
|
+
|
3788
|
+
// Tell Ember that this computed property depends on firstName
|
3789
|
+
// and lastName
|
3790
|
+
}).property('firstName', 'lastName')
|
3939
3791
|
});
|
3940
3792
|
|
3941
|
-
var
|
3793
|
+
var president = President.create({
|
3794
|
+
firstName: 'Barack',
|
3795
|
+
lastName: 'Obama'
|
3796
|
+
});
|
3942
3797
|
|
3943
|
-
|
3944
|
-
hamster.set('hasTent', true);
|
3945
|
-
hamster.get('readyForCamp'); // false
|
3946
|
-
hamster.set('hasBackpack', true);
|
3947
|
-
hamster.get('readyForCamp'); // true
|
3948
|
-
hamster.set('hasBackpack', 'Yes');
|
3949
|
-
hamster.get('readyForCamp'); // 'Yes'
|
3798
|
+
president.get('fullName'); // 'Barack Obama'
|
3950
3799
|
```
|
3951
3800
|
|
3952
|
-
@method
|
3953
|
-
@
|
3954
|
-
@
|
3955
|
-
@
|
3956
|
-
a logical `and` on the values of all the original values for properties.
|
3801
|
+
@method property
|
3802
|
+
@param {String} path* zero or more property paths
|
3803
|
+
@return {Ember.ComputedProperty} this
|
3804
|
+
@chainable
|
3957
3805
|
@public
|
3958
3806
|
*/
|
3959
|
-
|
3960
|
-
var
|
3961
|
-
|
3962
|
-
|
3963
|
-
|
3964
|
-
|
3965
|
-
|
3807
|
+
ComputedPropertyPrototype.property = function () {
|
3808
|
+
var args;
|
3809
|
+
|
3810
|
+
var addArg = function (property) {
|
3811
|
+
_emberMetalCore.default.assert('Depending on arrays using a dependent key ending with `@each` is no longer supported. ' + ('Please refactor from `Ember.computed(\'' + property + '\', function() {});` to `Ember.computed(\'' + property.slice(0, -6) + '.[]\', function() {})`.'), property.slice(-5) !== '@each');
|
3812
|
+
args.push(property);
|
3813
|
+
};
|
3814
|
+
|
3815
|
+
args = [];
|
3816
|
+
for (var i = 0, l = arguments.length; i < l; i++) {
|
3817
|
+
_emberMetalExpand_properties.default(arguments[i], addArg);
|
3966
3818
|
}
|
3967
|
-
return value;
|
3968
|
-
});
|
3969
3819
|
|
3970
|
-
|
3820
|
+
this._dependentKeys = args;
|
3821
|
+
return this;
|
3822
|
+
};
|
3823
|
+
|
3971
3824
|
/**
|
3972
|
-
|
3973
|
-
|
3974
|
-
|
3975
|
-
|
3976
|
-
|
3977
|
-
```javascript
|
3978
|
-
var Hamster = Ember.Object.extend({
|
3979
|
-
readyForRain: Ember.computed.or('hasJacket', 'hasUmbrella')
|
3980
|
-
});
|
3825
|
+
In some cases, you may want to annotate computed properties with additional
|
3826
|
+
metadata about how they function or what values they operate on. For example,
|
3827
|
+
computed property functions may close over variables that are then no longer
|
3828
|
+
available for introspection.
|
3981
3829
|
|
3982
|
-
|
3830
|
+
You can pass a hash of these values to a computed property like this:
|
3983
3831
|
|
3984
|
-
|
3985
|
-
|
3986
|
-
|
3987
|
-
|
3988
|
-
|
3832
|
+
```
|
3833
|
+
person: function() {
|
3834
|
+
var personId = this.get('personId');
|
3835
|
+
return App.Person.create({ id: personId });
|
3836
|
+
}.property().meta({ type: App.Person })
|
3989
3837
|
```
|
3990
3838
|
|
3991
|
-
|
3992
|
-
|
3993
|
-
|
3994
|
-
|
3995
|
-
|
3839
|
+
The hash that you pass to the `meta()` function will be saved on the
|
3840
|
+
computed property descriptor under the `_meta` key. Ember runtime
|
3841
|
+
exposes a public API for retrieving these values from classes,
|
3842
|
+
via the `metaForProperty()` function.
|
3843
|
+
|
3844
|
+
@method meta
|
3845
|
+
@param {Object} meta
|
3846
|
+
@chainable
|
3996
3847
|
@public
|
3997
3848
|
*/
|
3998
|
-
|
3999
|
-
|
4000
|
-
|
4001
|
-
|
4002
|
-
|
4003
|
-
|
4004
|
-
|
3849
|
+
|
3850
|
+
ComputedPropertyPrototype.meta = function (meta) {
|
3851
|
+
if (arguments.length === 0) {
|
3852
|
+
return this._meta || {};
|
3853
|
+
} else {
|
3854
|
+
this._meta = meta;
|
3855
|
+
return this;
|
4005
3856
|
}
|
4006
|
-
|
4007
|
-
|
3857
|
+
};
|
3858
|
+
|
3859
|
+
// invalidate cache when CP key changes
|
3860
|
+
ComputedPropertyPrototype.didChange = function (obj, keyName) {
|
3861
|
+
// _suspended is set via a CP.set to ensure we don't clear
|
3862
|
+
// the cached value set by the setter
|
3863
|
+
if (this._volatile || this._suspended === obj) {
|
3864
|
+
return;
|
3865
|
+
}
|
3866
|
+
|
3867
|
+
// don't create objects just to invalidate
|
3868
|
+
var meta = obj.__ember_meta__;
|
3869
|
+
if (!meta || meta.source !== obj) {
|
3870
|
+
return;
|
3871
|
+
}
|
3872
|
+
|
3873
|
+
var cache = meta.readableCache();
|
3874
|
+
if (cache && cache[keyName] !== undefined) {
|
3875
|
+
cache[keyName] = undefined;
|
3876
|
+
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
3877
|
+
}
|
3878
|
+
};
|
4008
3879
|
|
4009
|
-
exports.or = or;
|
4010
3880
|
/**
|
4011
|
-
|
4012
|
-
|
4013
|
-
|
4014
|
-
Example
|
3881
|
+
Access the value of the function backing the computed property.
|
3882
|
+
If this property has already been cached, return the cached result.
|
3883
|
+
Otherwise, call the function passing the property name as an argument.
|
4015
3884
|
|
4016
3885
|
```javascript
|
4017
|
-
var
|
4018
|
-
|
3886
|
+
var Person = Ember.Object.extend({
|
3887
|
+
fullName: function(keyName) {
|
3888
|
+
// the keyName parameter is 'fullName' in this case.
|
3889
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
3890
|
+
}.property('firstName', 'lastName')
|
4019
3891
|
});
|
4020
3892
|
|
4021
|
-
var hamster = Hamster.create();
|
4022
3893
|
|
4023
|
-
|
4024
|
-
|
4025
|
-
|
4026
|
-
|
3894
|
+
var tom = Person.create({
|
3895
|
+
firstName: 'Tom',
|
3896
|
+
lastName: 'Dale'
|
3897
|
+
});
|
3898
|
+
|
3899
|
+
tom.get('fullName') // 'Tom Dale'
|
4027
3900
|
```
|
4028
3901
|
|
4029
|
-
@method
|
4030
|
-
@
|
4031
|
-
@
|
4032
|
-
@return {Ember.ComputedProperty} computed property which maps
|
4033
|
-
values of all passed in properties to an array.
|
3902
|
+
@method get
|
3903
|
+
@param {String} keyName The key being accessed.
|
3904
|
+
@return {Object} The return value of the function backing the CP.
|
4034
3905
|
@public
|
4035
3906
|
*/
|
4036
|
-
|
4037
|
-
|
4038
|
-
|
4039
|
-
if (properties.hasOwnProperty(key)) {
|
4040
|
-
if (_emberMetalIs_none.default(properties[key])) {
|
4041
|
-
res.push(null);
|
4042
|
-
} else {
|
4043
|
-
res.push(properties[key]);
|
4044
|
-
}
|
4045
|
-
}
|
3907
|
+
ComputedPropertyPrototype.get = function (obj, keyName) {
|
3908
|
+
if (this._volatile) {
|
3909
|
+
return this._getter.call(obj, keyName);
|
4046
3910
|
}
|
4047
|
-
return res;
|
4048
|
-
});
|
4049
3911
|
|
4050
|
-
|
3912
|
+
var meta = metaFor(obj);
|
3913
|
+
var cache = meta.writableCache();
|
3914
|
+
|
3915
|
+
var result = cache[keyName];
|
3916
|
+
if (result === UNDEFINED) {
|
3917
|
+
return undefined;
|
3918
|
+
} else if (result !== undefined) {
|
3919
|
+
return result;
|
3920
|
+
}
|
3921
|
+
|
3922
|
+
var ret = this._getter.call(obj, keyName);
|
3923
|
+
if (ret === undefined) {
|
3924
|
+
cache[keyName] = UNDEFINED;
|
3925
|
+
} else {
|
3926
|
+
cache[keyName] = ret;
|
3927
|
+
}
|
3928
|
+
|
3929
|
+
var chainWatchers = meta.readableChainWatchers();
|
3930
|
+
if (chainWatchers) {
|
3931
|
+
chainWatchers.revalidate(keyName);
|
3932
|
+
}
|
3933
|
+
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
3934
|
+
|
3935
|
+
return ret;
|
3936
|
+
};
|
3937
|
+
|
4051
3938
|
/**
|
4052
|
-
|
4053
|
-
|
4054
|
-
|
3939
|
+
Set the value of a computed property. If the function that backs your
|
3940
|
+
computed property does not accept arguments then the default action for
|
3941
|
+
setting would be to define the property on the current object, and set
|
3942
|
+
the value of the property to the value being set.
|
3943
|
+
|
3944
|
+
Generally speaking if you intend for your computed property to be set
|
3945
|
+
your backing function should accept either two or three arguments.
|
4055
3946
|
|
4056
3947
|
```javascript
|
4057
3948
|
var Person = Ember.Object.extend({
|
4058
|
-
|
4059
|
-
|
4060
|
-
|
4061
|
-
|
4062
|
-
var alex = Person.create();
|
3949
|
+
// these will be supplied by `create`
|
3950
|
+
firstName: null,
|
3951
|
+
lastName: null,
|
4063
3952
|
|
4064
|
-
|
4065
|
-
|
3953
|
+
fullName: function(key, value, oldValue) {
|
3954
|
+
// getter
|
3955
|
+
if (arguments.length === 1) {
|
3956
|
+
var firstName = this.get('firstName');
|
3957
|
+
var lastName = this.get('lastName');
|
4066
3958
|
|
4067
|
-
|
4068
|
-
alex.get('name'); // '@machty'
|
4069
|
-
```
|
3959
|
+
return firstName + ' ' + lastName;
|
4070
3960
|
|
4071
|
-
|
4072
|
-
|
4073
|
-
|
4074
|
-
@return {Ember.ComputedProperty} computed property which creates an
|
4075
|
-
alias to the original value for property.
|
4076
|
-
@public
|
4077
|
-
*/
|
4078
|
-
|
4079
|
-
/**
|
4080
|
-
Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
|
4081
|
-
data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
|
4082
|
-
not mutate the upstream property, rather causes the current property to
|
4083
|
-
become the value set. This causes the downstream property to permanently
|
4084
|
-
diverge from the upstream property.
|
3961
|
+
// setter
|
3962
|
+
} else {
|
3963
|
+
var name = value.split(' ');
|
4085
3964
|
|
4086
|
-
|
3965
|
+
this.set('firstName', name[0]);
|
3966
|
+
this.set('lastName', name[1]);
|
4087
3967
|
|
4088
|
-
|
4089
|
-
|
4090
|
-
firstName
|
4091
|
-
lastName: null,
|
4092
|
-
nickName: Ember.computed.oneWay('firstName')
|
3968
|
+
return value;
|
3969
|
+
}
|
3970
|
+
}.property('firstName', 'lastName')
|
4093
3971
|
});
|
4094
3972
|
|
4095
|
-
var
|
4096
|
-
firstName: 'Teddy',
|
4097
|
-
lastName: 'Zeenny'
|
4098
|
-
});
|
3973
|
+
var person = Person.create();
|
4099
3974
|
|
4100
|
-
|
4101
|
-
|
4102
|
-
|
3975
|
+
person.set('fullName', 'Peter Wagenet');
|
3976
|
+
person.get('firstName'); // 'Peter'
|
3977
|
+
person.get('lastName'); // 'Wagenet'
|
4103
3978
|
```
|
4104
3979
|
|
4105
|
-
@method
|
4106
|
-
@
|
4107
|
-
@param {
|
4108
|
-
@
|
4109
|
-
|
3980
|
+
@method set
|
3981
|
+
@param {String} keyName The key being accessed.
|
3982
|
+
@param {Object} newValue The new value being assigned.
|
3983
|
+
@param {String} oldValue The old value being replaced.
|
3984
|
+
@return {Object} The return value of the function backing the CP.
|
4110
3985
|
@public
|
4111
3986
|
*/
|
3987
|
+
ComputedPropertyPrototype.set = function computedPropertySetEntry(obj, keyName, value) {
|
3988
|
+
if (this._readOnly) {
|
3989
|
+
this._throwReadOnlyError(obj, keyName);
|
3990
|
+
}
|
4112
3991
|
|
4113
|
-
|
4114
|
-
|
4115
|
-
|
3992
|
+
if (!this._setter) {
|
3993
|
+
return this.clobberSet(obj, keyName, value);
|
3994
|
+
}
|
4116
3995
|
|
4117
|
-
|
4118
|
-
|
4119
|
-
|
4120
|
-
|
4121
|
-
|
4122
|
-
|
4123
|
-
|
4124
|
-
|
4125
|
-
|
4126
|
-
|
4127
|
-
|
3996
|
+
if (this._volatile) {
|
3997
|
+
return this.volatileSet(obj, keyName, value);
|
3998
|
+
}
|
3999
|
+
|
4000
|
+
return this.setWithSuspend(obj, keyName, value);
|
4001
|
+
};
|
4002
|
+
|
4003
|
+
ComputedPropertyPrototype._throwReadOnlyError = function computedPropertyThrowReadOnlyError(obj, keyName) {
|
4004
|
+
throw new _emberMetalError.default('Cannot set read-only property "' + keyName + '" on object: ' + _emberMetalUtils.inspect(obj));
|
4005
|
+
};
|
4006
|
+
|
4007
|
+
ComputedPropertyPrototype.clobberSet = function computedPropertyClobberSet(obj, keyName, value) {
|
4008
|
+
var cachedValue = cacheFor(obj, keyName);
|
4009
|
+
_emberMetalProperties.defineProperty(obj, keyName, null, cachedValue);
|
4010
|
+
_emberMetalProperty_set.set(obj, keyName, value);
|
4011
|
+
return value;
|
4012
|
+
};
|
4013
|
+
|
4014
|
+
ComputedPropertyPrototype.volatileSet = function computedPropertyVolatileSet(obj, keyName, value) {
|
4015
|
+
return this._setter.call(obj, keyName, value);
|
4016
|
+
};
|
4017
|
+
|
4018
|
+
ComputedPropertyPrototype.setWithSuspend = function computedPropertySetWithSuspend(obj, keyName, value) {
|
4019
|
+
var oldSuspended = this._suspended;
|
4020
|
+
this._suspended = obj;
|
4021
|
+
try {
|
4022
|
+
return this._set(obj, keyName, value);
|
4023
|
+
} finally {
|
4024
|
+
this._suspended = oldSuspended;
|
4025
|
+
}
|
4026
|
+
};
|
4027
|
+
|
4028
|
+
ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
|
4029
|
+
// cache requires own meta
|
4030
|
+
var meta = metaFor(obj);
|
4031
|
+
// either there is a writable cache or we need one to update
|
4032
|
+
var cache = meta.writableCache();
|
4033
|
+
var hadCachedValue = false;
|
4034
|
+
var cachedValue = undefined;
|
4035
|
+
if (cache[keyName] !== undefined) {
|
4036
|
+
if (cache[keyName] !== UNDEFINED) {
|
4037
|
+
cachedValue = cache[keyName];
|
4038
|
+
}
|
4039
|
+
hadCachedValue = true;
|
4040
|
+
}
|
4041
|
+
|
4042
|
+
var ret = this._setter.call(obj, keyName, value, cachedValue);
|
4043
|
+
|
4044
|
+
// allows setter to return the same value that is cached already
|
4045
|
+
if (hadCachedValue && cachedValue === ret) {
|
4046
|
+
return ret;
|
4047
|
+
}
|
4048
|
+
|
4049
|
+
var watched = meta.peekWatching(keyName);
|
4050
|
+
if (watched) {
|
4051
|
+
_emberMetalProperty_events.propertyWillChange(obj, keyName);
|
4052
|
+
}
|
4053
|
+
|
4054
|
+
if (hadCachedValue) {
|
4055
|
+
cache[keyName] = undefined;
|
4056
|
+
}
|
4057
|
+
|
4058
|
+
if (!hadCachedValue) {
|
4059
|
+
_emberMetalDependent_keys.addDependentKeys(this, obj, keyName, meta);
|
4060
|
+
}
|
4061
|
+
|
4062
|
+
if (ret === undefined) {
|
4063
|
+
cache[keyName] = UNDEFINED;
|
4064
|
+
} else {
|
4065
|
+
cache[keyName] = ret;
|
4066
|
+
}
|
4067
|
+
|
4068
|
+
if (watched) {
|
4069
|
+
_emberMetalProperty_events.propertyDidChange(obj, keyName);
|
4070
|
+
}
|
4071
|
+
|
4072
|
+
return ret;
|
4073
|
+
};
|
4074
|
+
|
4075
|
+
/* called before property is overridden */
|
4076
|
+
ComputedPropertyPrototype.teardown = function (obj, keyName) {
|
4077
|
+
if (this._volatile) {
|
4078
|
+
return;
|
4079
|
+
}
|
4080
|
+
var meta = metaFor(obj);
|
4081
|
+
var cache = meta.readableCache();
|
4082
|
+
if (cache && cache[keyName] !== undefined) {
|
4083
|
+
_emberMetalDependent_keys.removeDependentKeys(this, obj, keyName, meta);
|
4084
|
+
cache[keyName] = undefined;
|
4085
|
+
}
|
4086
|
+
};
|
4128
4087
|
|
4129
4088
|
/**
|
4130
|
-
|
4131
|
-
|
4132
|
-
|
4089
|
+
This helper returns a new property descriptor that wraps the passed
|
4090
|
+
computed property function. You can use this helper to define properties
|
4091
|
+
with mixins or via `Ember.defineProperty()`.
|
4133
4092
|
|
4134
|
-
|
4093
|
+
The function you pass will be used to both get and set property values.
|
4094
|
+
The function should accept two parameters, key and value. If value is not
|
4095
|
+
undefined you should set the value first. In either case return the
|
4096
|
+
current value of the property.
|
4135
4097
|
|
4136
|
-
|
4098
|
+
A computed property defined in this way might look like this:
|
4137
4099
|
|
4138
|
-
```
|
4139
|
-
var
|
4140
|
-
firstName:
|
4141
|
-
lastName:
|
4142
|
-
nickName: Ember.computed.readOnly('firstName')
|
4143
|
-
});
|
4100
|
+
```js
|
4101
|
+
var Person = Ember.Object.extend({
|
4102
|
+
firstName: 'Betty',
|
4103
|
+
lastName: 'Jones',
|
4144
4104
|
|
4145
|
-
|
4146
|
-
|
4147
|
-
|
4105
|
+
fullName: Ember.computed('firstName', 'lastName', function(key, value) {
|
4106
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
4107
|
+
})
|
4148
4108
|
});
|
4149
4109
|
|
4150
|
-
|
4151
|
-
|
4152
|
-
|
4153
|
-
|
4110
|
+
var client = Person.create();
|
4111
|
+
|
4112
|
+
client.get('fullName'); // 'Betty Jones'
|
4113
|
+
|
4114
|
+
client.set('lastName', 'Fuller');
|
4115
|
+
client.get('fullName'); // 'Betty Fuller'
|
4154
4116
|
```
|
4155
4117
|
|
4156
|
-
|
4157
|
-
|
4158
|
-
|
4159
|
-
|
4160
|
-
|
4161
|
-
|
4118
|
+
_Note: This is the preferred way to define computed properties when writing third-party
|
4119
|
+
libraries that depend on or use Ember, since there is no guarantee that the user
|
4120
|
+
will have prototype extensions enabled._
|
4121
|
+
|
4122
|
+
You might use this method if you disabled
|
4123
|
+
[Prototype Extensions](http://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/).
|
4124
|
+
The alternative syntax might look like this
|
4125
|
+
(if prototype extensions are enabled, which is the default behavior):
|
4126
|
+
|
4127
|
+
```js
|
4128
|
+
fullName: function () {
|
4129
|
+
return this.get('firstName') + ' ' + this.get('lastName');
|
4130
|
+
}.property('firstName', 'lastName')
|
4131
|
+
```
|
4132
|
+
|
4133
|
+
@class computed
|
4134
|
+
@namespace Ember
|
4135
|
+
@constructor
|
4136
|
+
@static
|
4137
|
+
@param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
|
4138
|
+
@param {Function} func The computed property function.
|
4139
|
+
@return {Ember.ComputedProperty} property descriptor instance
|
4162
4140
|
@public
|
4163
4141
|
*/
|
4164
4142
|
|
4165
|
-
function
|
4166
|
-
|
4143
|
+
function computed(func) {
|
4144
|
+
var args;
|
4145
|
+
|
4146
|
+
if (arguments.length > 1) {
|
4147
|
+
args = [].slice.call(arguments);
|
4148
|
+
func = args.pop();
|
4149
|
+
}
|
4150
|
+
|
4151
|
+
var cp = new ComputedProperty(func);
|
4152
|
+
|
4153
|
+
if (args) {
|
4154
|
+
cp.property.apply(cp, args);
|
4155
|
+
}
|
4156
|
+
|
4157
|
+
return cp;
|
4167
4158
|
}
|
4168
4159
|
|
4169
4160
|
/**
|
4170
|
-
|
4171
|
-
|
4172
|
-
|
4173
|
-
|
4161
|
+
Returns the cached value for a property, if one exists.
|
4162
|
+
This can be useful for peeking at the value of a computed
|
4163
|
+
property that is generated lazily, without accidentally causing
|
4164
|
+
it to be created.
|
4174
4165
|
|
4175
|
-
@method
|
4176
|
-
@for Ember
|
4177
|
-
@param {
|
4178
|
-
@
|
4179
|
-
|
4180
|
-
@
|
4166
|
+
@method cacheFor
|
4167
|
+
@for Ember
|
4168
|
+
@param {Object} obj the object whose property you want to check
|
4169
|
+
@param {String} key the name of the property whose cached value you want
|
4170
|
+
to return
|
4171
|
+
@return {Object} the cached value
|
4181
4172
|
@public
|
4182
4173
|
*/
|
4174
|
+
function cacheFor(obj, key) {
|
4175
|
+
var meta = obj.__ember_meta__;
|
4176
|
+
var cache = meta && meta.source === obj && meta.readableCache();
|
4177
|
+
var ret = cache && cache[key];
|
4183
4178
|
|
4184
|
-
|
4185
|
-
|
4186
|
-
|
4187
|
-
|
4188
|
-
return _emberMetalProperty_get.get(this, dependentKey);
|
4189
|
-
},
|
4190
|
-
set: function (key, value) {
|
4191
|
-
_emberMetalCore.default.deprecate('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options);
|
4192
|
-
_emberMetalProperty_set.set(this, dependentKey, value);
|
4193
|
-
return value;
|
4194
|
-
}
|
4195
|
-
});
|
4179
|
+
if (ret === UNDEFINED) {
|
4180
|
+
return undefined;
|
4181
|
+
}
|
4182
|
+
return ret;
|
4196
4183
|
}
|
4184
|
+
|
4185
|
+
cacheFor.set = function (cache, key, value) {
|
4186
|
+
if (value === undefined) {
|
4187
|
+
cache[key] = UNDEFINED;
|
4188
|
+
} else {
|
4189
|
+
cache[key] = value;
|
4190
|
+
}
|
4191
|
+
};
|
4192
|
+
|
4193
|
+
cacheFor.get = function (cache, key) {
|
4194
|
+
var ret = cache[key];
|
4195
|
+
if (ret === UNDEFINED) {
|
4196
|
+
return undefined;
|
4197
|
+
}
|
4198
|
+
return ret;
|
4199
|
+
};
|
4200
|
+
|
4201
|
+
cacheFor.remove = function (cache, key) {
|
4202
|
+
cache[key] = undefined;
|
4203
|
+
};
|
4204
|
+
|
4205
|
+
exports.ComputedProperty = ComputedProperty;
|
4206
|
+
exports.computed = computed;
|
4207
|
+
exports.cacheFor = cacheFor;
|
4197
4208
|
});
|
4198
4209
|
enifed('ember-metal/core', ['exports', 'ember-metal/assert'], function (exports, _emberMetalAssert) {
|
4199
4210
|
/*globals Ember:true,ENV,EmberENV */
|
@@ -4218,7 +4229,7 @@ enifed('ember-metal/core', ['exports', 'ember-metal/assert'], function (exports,
|
|
4218
4229
|
|
4219
4230
|
@class Ember
|
4220
4231
|
@static
|
4221
|
-
@version 2.1.0-beta.
|
4232
|
+
@version 2.1.0-beta.3
|
4222
4233
|
@public
|
4223
4234
|
*/
|
4224
4235
|
|
@@ -4252,11 +4263,11 @@ enifed('ember-metal/core', ['exports', 'ember-metal/assert'], function (exports,
|
|
4252
4263
|
|
4253
4264
|
@property VERSION
|
4254
4265
|
@type String
|
4255
|
-
@default '2.1.0-beta.
|
4266
|
+
@default '2.1.0-beta.3'
|
4256
4267
|
@static
|
4257
4268
|
@public
|
4258
4269
|
*/
|
4259
|
-
Ember.VERSION = '2.1.0-beta.
|
4270
|
+
Ember.VERSION = '2.1.0-beta.3';
|
4260
4271
|
|
4261
4272
|
/**
|
4262
4273
|
The hash of environment variables used to control various configuration
|
@@ -6346,21 +6357,194 @@ enifed('ember-metal/merge', ['exports'], function (exports) {
|
|
6346
6357
|
|
6347
6358
|
exports.default = merge;
|
6348
6359
|
|
6349
|
-
function merge(original, updates) {
|
6350
|
-
if (!updates || typeof updates !== 'object') {
|
6351
|
-
return original;
|
6360
|
+
function merge(original, updates) {
|
6361
|
+
if (!updates || typeof updates !== 'object') {
|
6362
|
+
return original;
|
6363
|
+
}
|
6364
|
+
|
6365
|
+
var props = Object.keys(updates);
|
6366
|
+
var prop;
|
6367
|
+
var length = props.length;
|
6368
|
+
|
6369
|
+
for (var i = 0; i < length; i++) {
|
6370
|
+
prop = props[i];
|
6371
|
+
original[prop] = updates[prop];
|
6372
|
+
}
|
6373
|
+
|
6374
|
+
return original;
|
6375
|
+
}
|
6376
|
+
});
|
6377
|
+
enifed('ember-metal/meta_listeners', ['exports'], function (exports) {
|
6378
|
+
/*
|
6379
|
+
When we render a rich template hierarchy, the set of events that
|
6380
|
+
*might* happen tends to be much larger than the set of events that
|
6381
|
+
actually happen. This implies that we should make listener creation &
|
6382
|
+
destruction cheap, even at the cost of making event dispatch more
|
6383
|
+
expensive.
|
6384
|
+
|
6385
|
+
Thus we store a new listener with a single push and no new
|
6386
|
+
allocations, without even bothering to do deduplication -- we can
|
6387
|
+
save that for dispatch time, if an event actually happens.
|
6388
|
+
*/
|
6389
|
+
|
6390
|
+
/* listener flags */
|
6391
|
+
'use strict';
|
6392
|
+
|
6393
|
+
var ONCE = 1;
|
6394
|
+
exports.ONCE = ONCE;
|
6395
|
+
var SUSPENDED = 2;
|
6396
|
+
|
6397
|
+
exports.SUSPENDED = SUSPENDED;
|
6398
|
+
var protoMethods = {
|
6399
|
+
|
6400
|
+
addToListeners: function (eventName, target, method, flags) {
|
6401
|
+
if (!this._listeners) {
|
6402
|
+
this._listeners = [];
|
6403
|
+
}
|
6404
|
+
this._listeners.push(eventName, target, method, flags);
|
6405
|
+
},
|
6406
|
+
|
6407
|
+
_finalizeListeners: function () {
|
6408
|
+
if (this._listenersFinalized) {
|
6409
|
+
return;
|
6410
|
+
}
|
6411
|
+
if (!this._listeners) {
|
6412
|
+
this._listeners = [];
|
6413
|
+
}
|
6414
|
+
var pointer = this.parent;
|
6415
|
+
while (pointer) {
|
6416
|
+
var listeners = pointer._listeners;
|
6417
|
+
if (listeners) {
|
6418
|
+
this._listeners = this._listeners.concat(listeners);
|
6419
|
+
}
|
6420
|
+
if (pointer._listenersFinalized) {
|
6421
|
+
break;
|
6422
|
+
}
|
6423
|
+
pointer = pointer.parent;
|
6424
|
+
}
|
6425
|
+
this._listenersFinalized = true;
|
6426
|
+
},
|
6427
|
+
|
6428
|
+
removeFromListeners: function (eventName, target, method, didRemove) {
|
6429
|
+
var pointer = this;
|
6430
|
+
while (pointer) {
|
6431
|
+
var listeners = pointer._listeners;
|
6432
|
+
if (listeners) {
|
6433
|
+
for (var index = listeners.length - 4; index >= 0; index -= 4) {
|
6434
|
+
if (listeners[index] === eventName && (!method || listeners[index + 1] === target && listeners[index + 2] === method)) {
|
6435
|
+
if (pointer === this) {
|
6436
|
+
// we are modifying our own list, so we edit directly
|
6437
|
+
if (typeof didRemove === 'function') {
|
6438
|
+
didRemove(eventName, target, listeners[index + 2]);
|
6439
|
+
}
|
6440
|
+
listeners.splice(index, 4);
|
6441
|
+
} else {
|
6442
|
+
// we are trying to remove an inherited listener, so we do
|
6443
|
+
// just-in-time copying to detach our own listeners from
|
6444
|
+
// our inheritance chain.
|
6445
|
+
this._finalizeListeners();
|
6446
|
+
return this.removeFromListeners(eventName, target, method);
|
6447
|
+
}
|
6448
|
+
}
|
6449
|
+
}
|
6450
|
+
}
|
6451
|
+
if (pointer._listenersFinalized) {
|
6452
|
+
break;
|
6453
|
+
}
|
6454
|
+
pointer = pointer.parent;
|
6455
|
+
}
|
6456
|
+
},
|
6457
|
+
|
6458
|
+
matchingListeners: function (eventName) {
|
6459
|
+
var pointer = this;
|
6460
|
+
var result = [];
|
6461
|
+
while (pointer) {
|
6462
|
+
var listeners = pointer._listeners;
|
6463
|
+
if (listeners) {
|
6464
|
+
for (var index = 0; index < listeners.length - 3; index += 4) {
|
6465
|
+
if (listeners[index] === eventName) {
|
6466
|
+
pushUniqueListener(result, listeners, index);
|
6467
|
+
}
|
6468
|
+
}
|
6469
|
+
}
|
6470
|
+
if (pointer._listenersFinalized) {
|
6471
|
+
break;
|
6472
|
+
}
|
6473
|
+
pointer = pointer.parent;
|
6474
|
+
}
|
6475
|
+
var sus = this._suspendedListeners;
|
6476
|
+
if (sus) {
|
6477
|
+
for (var susIndex = 0; susIndex < sus.length - 2; susIndex += 3) {
|
6478
|
+
if (eventName === sus[susIndex]) {
|
6479
|
+
for (var resultIndex = 0; resultIndex < result.length - 2; resultIndex += 3) {
|
6480
|
+
if (result[resultIndex] === sus[susIndex + 1] && result[resultIndex + 1] === sus[susIndex + 2]) {
|
6481
|
+
result[resultIndex + 2] |= SUSPENDED;
|
6482
|
+
}
|
6483
|
+
}
|
6484
|
+
}
|
6485
|
+
}
|
6486
|
+
}
|
6487
|
+
return result;
|
6488
|
+
},
|
6489
|
+
|
6490
|
+
suspendListeners: function (eventNames, target, method, callback) {
|
6491
|
+
var sus = this._suspendedListeners;
|
6492
|
+
if (!sus) {
|
6493
|
+
sus = this._suspendedListeners = [];
|
6494
|
+
}
|
6495
|
+
for (var i = 0; i < eventNames.length; i++) {
|
6496
|
+
sus.push(eventNames[i], target, method);
|
6497
|
+
}
|
6498
|
+
try {
|
6499
|
+
return callback.call(target);
|
6500
|
+
} finally {
|
6501
|
+
if (sus.length === eventNames.length) {
|
6502
|
+
this._suspendedListeners = undefined;
|
6503
|
+
} else {
|
6504
|
+
for (var i = sus.length - 3; i >= 0; i -= 3) {
|
6505
|
+
if (sus[i + 1] === target && sus[i + 2] === method && eventNames.indexOf(sus[i]) !== -1) {
|
6506
|
+
sus.splice(i, 3);
|
6507
|
+
}
|
6508
|
+
}
|
6509
|
+
}
|
6510
|
+
}
|
6511
|
+
},
|
6512
|
+
|
6513
|
+
watchedEvents: function () {
|
6514
|
+
var pointer = this;
|
6515
|
+
var names = {};
|
6516
|
+
while (pointer) {
|
6517
|
+
var listeners = pointer._listeners;
|
6518
|
+
if (listeners) {
|
6519
|
+
for (var index = 0; index < listeners.length - 3; index += 4) {
|
6520
|
+
names[listeners[index]] = true;
|
6521
|
+
}
|
6522
|
+
}
|
6523
|
+
if (pointer._listenersFinalized) {
|
6524
|
+
break;
|
6525
|
+
}
|
6526
|
+
pointer = pointer.parent;
|
6527
|
+
}
|
6528
|
+
return Object.keys(names);
|
6529
|
+
},
|
6530
|
+
|
6531
|
+
_initializeListeners: function () {
|
6532
|
+
this._listeners = undefined;
|
6533
|
+
this._listenersFinalized = undefined;
|
6534
|
+
this._suspendedListeners = undefined;
|
6352
6535
|
}
|
6536
|
+
};
|
6353
6537
|
|
6354
|
-
|
6355
|
-
|
6356
|
-
var
|
6357
|
-
|
6358
|
-
for (var
|
6359
|
-
|
6360
|
-
|
6538
|
+
exports.protoMethods = protoMethods;
|
6539
|
+
function pushUniqueListener(destination, source, index) {
|
6540
|
+
var target = source[index + 1];
|
6541
|
+
var method = source[index + 2];
|
6542
|
+
for (var destinationIndex = 0; destinationIndex < destination.length - 2; destinationIndex += 3) {
|
6543
|
+
if (destination[destinationIndex] === target && destination[destinationIndex + 1] === method) {
|
6544
|
+
return;
|
6545
|
+
}
|
6361
6546
|
}
|
6362
|
-
|
6363
|
-
return original;
|
6547
|
+
destination.push(target, method, source[index + 3]);
|
6364
6548
|
}
|
6365
6549
|
});
|
6366
6550
|
enifed('ember-metal/meta', ['exports', 'ember-metal/features', 'ember-metal/meta_listeners', 'ember-metal/empty_object'], function (exports, _emberMetalFeatures, _emberMetalMeta_listeners, _emberMetalEmpty_object) {
|
@@ -6556,278 +6740,105 @@ enifed('ember-metal/meta', ['exports', 'ember-metal/features', 'ember-metal/meta
|
|
6556
6740
|
};
|
6557
6741
|
}
|
6558
6742
|
|
6559
|
-
// Implements a member that provides an inheritable, lazily-created
|
6560
|
-
// object using the method you provide. We will derived children from
|
6561
|
-
// their parents by calling your object's `copy()` method.
|
6562
|
-
function inheritedCustomObject(name, Meta) {
|
6563
|
-
var key = memberProperty(name);
|
6564
|
-
var capitalized = capitalize(name);
|
6565
|
-
Meta.prototype['writable' + capitalized] = function (create) {
|
6566
|
-
var ret = this[key];
|
6567
|
-
if (!ret) {
|
6568
|
-
if (this.parent) {
|
6569
|
-
ret = this[key] = this.parent['writable' + capitalized](create).copy(this.source);
|
6570
|
-
} else {
|
6571
|
-
ret = this[key] = create(this.source);
|
6572
|
-
}
|
6573
|
-
}
|
6574
|
-
return ret;
|
6575
|
-
};
|
6576
|
-
Meta.prototype['readable' + capitalized] = function () {
|
6577
|
-
return this._getInherited(key);
|
6578
|
-
};
|
6579
|
-
}
|
6580
|
-
|
6581
|
-
function memberProperty(name) {
|
6582
|
-
return '_' + name;
|
6583
|
-
}
|
6584
|
-
|
6585
|
-
// there's a more general-purpose capitalize in ember-runtime, but we
|
6586
|
-
// don't want to make ember-metal depend on ember-runtime.
|
6587
|
-
function capitalize(name) {
|
6588
|
-
return name.replace(/^\w/, function (m) {
|
6589
|
-
return m.toUpperCase();
|
6590
|
-
});
|
6591
|
-
}
|
6592
|
-
|
6593
|
-
var META_DESC = {
|
6594
|
-
writable: true,
|
6595
|
-
configurable: true,
|
6596
|
-
enumerable: false,
|
6597
|
-
value: null
|
6598
|
-
};
|
6599
|
-
|
6600
|
-
exports.META_DESC = META_DESC;
|
6601
|
-
var EMBER_META_PROPERTY = {
|
6602
|
-
name: '__ember_meta__',
|
6603
|
-
descriptor: META_DESC
|
6604
|
-
};
|
6605
|
-
|
6606
|
-
// Placeholder for non-writable metas.
|
6607
|
-
var EMPTY_META = new Meta(null);
|
6608
|
-
|
6609
|
-
exports.EMPTY_META = EMPTY_META;
|
6610
|
-
|
6611
|
-
EMPTY_META.writableValues();
|
6612
|
-
|
6613
|
-
/**
|
6614
|
-
Retrieves the meta hash for an object. If `writable` is true ensures the
|
6615
|
-
hash is writable for this object as well.
|
6616
|
-
|
6617
|
-
The meta object contains information about computed property descriptors as
|
6618
|
-
well as any watched properties and other information. You generally will
|
6619
|
-
not access this information directly but instead work with higher level
|
6620
|
-
methods that manipulate this hash indirectly.
|
6621
|
-
|
6622
|
-
@method meta
|
6623
|
-
@for Ember
|
6624
|
-
@private
|
6625
|
-
|
6626
|
-
@param {Object} obj The object to retrieve meta for
|
6627
|
-
@param {Boolean} [writable=true] Pass `false` if you do not intend to modify
|
6628
|
-
the meta hash, allowing the method to avoid making an unnecessary copy.
|
6629
|
-
@return {Object} the meta hash for an object
|
6630
|
-
*/
|
6631
|
-
|
6632
|
-
function meta(obj, writable) {
|
6633
|
-
var ret = obj.__ember_meta__;
|
6634
|
-
if (writable === false) {
|
6635
|
-
return ret || EMPTY_META;
|
6636
|
-
}
|
6637
|
-
|
6638
|
-
if (ret && ret.source === obj) {
|
6639
|
-
return ret;
|
6640
|
-
}
|
6641
|
-
|
6642
|
-
if (!ret) {
|
6643
|
-
ret = new Meta(obj);
|
6644
|
-
|
6645
|
-
ret.writableValues();
|
6646
|
-
} else {
|
6647
|
-
ret = new Meta(obj, ret);
|
6648
|
-
}
|
6649
|
-
|
6650
|
-
if (obj.__defineNonEnumerable) {
|
6651
|
-
obj.__defineNonEnumerable(EMBER_META_PROPERTY);
|
6652
|
-
} else {
|
6653
|
-
Object.defineProperty(obj, '__ember_meta__', META_DESC);
|
6654
|
-
}
|
6655
|
-
obj.__ember_meta__ = ret;
|
6656
|
-
|
6657
|
-
return ret;
|
6658
|
-
}
|
6659
|
-
});
|
6660
|
-
enifed('ember-metal/meta_listeners', ['exports'], function (exports) {
|
6661
|
-
/*
|
6662
|
-
When we render a rich template hierarchy, the set of events that
|
6663
|
-
*might* happen tends to be much larger than the set of events that
|
6664
|
-
actually happen. This implies that we should make listener creation &
|
6665
|
-
destruction cheap, even at the cost of making event dispatch more
|
6666
|
-
expensive.
|
6667
|
-
|
6668
|
-
Thus we store a new listener with a single push and no new
|
6669
|
-
allocations, without even bothering to do deduplication -- we can
|
6670
|
-
save that for dispatch time, if an event actually happens.
|
6671
|
-
*/
|
6672
|
-
|
6673
|
-
/* listener flags */
|
6674
|
-
'use strict';
|
6675
|
-
|
6676
|
-
var ONCE = 1;
|
6677
|
-
exports.ONCE = ONCE;
|
6678
|
-
var SUSPENDED = 2;
|
6679
|
-
|
6680
|
-
exports.SUSPENDED = SUSPENDED;
|
6681
|
-
var protoMethods = {
|
6682
|
-
|
6683
|
-
addToListeners: function (eventName, target, method, flags) {
|
6684
|
-
if (!this._listeners) {
|
6685
|
-
this._listeners = [];
|
6686
|
-
}
|
6687
|
-
this._listeners.push(eventName, target, method, flags);
|
6688
|
-
},
|
6689
|
-
|
6690
|
-
_finalizeListeners: function () {
|
6691
|
-
if (this._listenersFinalized) {
|
6692
|
-
return;
|
6693
|
-
}
|
6694
|
-
if (!this._listeners) {
|
6695
|
-
this._listeners = [];
|
6696
|
-
}
|
6697
|
-
var pointer = this.parent;
|
6698
|
-
while (pointer) {
|
6699
|
-
var listeners = pointer._listeners;
|
6700
|
-
if (listeners) {
|
6701
|
-
this._listeners = this._listeners.concat(listeners);
|
6702
|
-
}
|
6703
|
-
if (pointer._listenersFinalized) {
|
6704
|
-
break;
|
6705
|
-
}
|
6706
|
-
pointer = pointer.parent;
|
6707
|
-
}
|
6708
|
-
this._listenersFinalized = true;
|
6709
|
-
},
|
6710
|
-
|
6711
|
-
removeFromListeners: function (eventName, target, method, didRemove) {
|
6712
|
-
var pointer = this;
|
6713
|
-
while (pointer) {
|
6714
|
-
var listeners = pointer._listeners;
|
6715
|
-
if (listeners) {
|
6716
|
-
for (var index = listeners.length - 4; index >= 0; index -= 4) {
|
6717
|
-
if (listeners[index] === eventName && (!method || listeners[index + 1] === target && listeners[index + 2] === method)) {
|
6718
|
-
if (pointer === this) {
|
6719
|
-
// we are modifying our own list, so we edit directly
|
6720
|
-
if (typeof didRemove === 'function') {
|
6721
|
-
didRemove(eventName, target, listeners[index + 2]);
|
6722
|
-
}
|
6723
|
-
listeners.splice(index, 4);
|
6724
|
-
} else {
|
6725
|
-
// we are trying to remove an inherited listener, so we do
|
6726
|
-
// just-in-time copying to detach our own listeners from
|
6727
|
-
// our inheritance chain.
|
6728
|
-
this._finalizeListeners();
|
6729
|
-
return this.removeFromListeners(eventName, target, method);
|
6730
|
-
}
|
6731
|
-
}
|
6732
|
-
}
|
6733
|
-
}
|
6734
|
-
if (pointer._listenersFinalized) {
|
6735
|
-
break;
|
6736
|
-
}
|
6737
|
-
pointer = pointer.parent;
|
6738
|
-
}
|
6739
|
-
},
|
6740
|
-
|
6741
|
-
matchingListeners: function (eventName) {
|
6742
|
-
var pointer = this;
|
6743
|
-
var result = [];
|
6744
|
-
while (pointer) {
|
6745
|
-
var listeners = pointer._listeners;
|
6746
|
-
if (listeners) {
|
6747
|
-
for (var index = 0; index < listeners.length - 3; index += 4) {
|
6748
|
-
if (listeners[index] === eventName) {
|
6749
|
-
pushUniqueListener(result, listeners, index);
|
6750
|
-
}
|
6751
|
-
}
|
6752
|
-
}
|
6753
|
-
if (pointer._listenersFinalized) {
|
6754
|
-
break;
|
6755
|
-
}
|
6756
|
-
pointer = pointer.parent;
|
6757
|
-
}
|
6758
|
-
var sus = this._suspendedListeners;
|
6759
|
-
if (sus) {
|
6760
|
-
for (var susIndex = 0; susIndex < sus.length - 2; susIndex += 3) {
|
6761
|
-
if (eventName === sus[susIndex]) {
|
6762
|
-
for (var resultIndex = 0; resultIndex < result.length - 2; resultIndex += 3) {
|
6763
|
-
if (result[resultIndex] === sus[susIndex + 1] && result[resultIndex + 1] === sus[susIndex + 2]) {
|
6764
|
-
result[resultIndex + 2] |= SUSPENDED;
|
6765
|
-
}
|
6766
|
-
}
|
6767
|
-
}
|
6768
|
-
}
|
6769
|
-
}
|
6770
|
-
return result;
|
6771
|
-
},
|
6772
|
-
|
6773
|
-
suspendListeners: function (eventNames, target, method, callback) {
|
6774
|
-
var sus = this._suspendedListeners;
|
6775
|
-
if (!sus) {
|
6776
|
-
sus = this._suspendedListeners = [];
|
6777
|
-
}
|
6778
|
-
for (var i = 0; i < eventNames.length; i++) {
|
6779
|
-
sus.push(eventNames[i], target, method);
|
6780
|
-
}
|
6781
|
-
try {
|
6782
|
-
return callback.call(target);
|
6783
|
-
} finally {
|
6784
|
-
if (sus.length === eventNames.length) {
|
6785
|
-
this._suspendedListeners = undefined;
|
6743
|
+
// Implements a member that provides an inheritable, lazily-created
|
6744
|
+
// object using the method you provide. We will derived children from
|
6745
|
+
// their parents by calling your object's `copy()` method.
|
6746
|
+
function inheritedCustomObject(name, Meta) {
|
6747
|
+
var key = memberProperty(name);
|
6748
|
+
var capitalized = capitalize(name);
|
6749
|
+
Meta.prototype['writable' + capitalized] = function (create) {
|
6750
|
+
var ret = this[key];
|
6751
|
+
if (!ret) {
|
6752
|
+
if (this.parent) {
|
6753
|
+
ret = this[key] = this.parent['writable' + capitalized](create).copy(this.source);
|
6786
6754
|
} else {
|
6787
|
-
|
6788
|
-
if (sus[i + 1] === target && sus[i + 2] === method && eventNames.indexOf(sus[i]) !== -1) {
|
6789
|
-
sus.splice(i, 3);
|
6790
|
-
}
|
6791
|
-
}
|
6755
|
+
ret = this[key] = create(this.source);
|
6792
6756
|
}
|
6793
6757
|
}
|
6794
|
-
|
6758
|
+
return ret;
|
6759
|
+
};
|
6760
|
+
Meta.prototype['readable' + capitalized] = function () {
|
6761
|
+
return this._getInherited(key);
|
6762
|
+
};
|
6763
|
+
}
|
6795
6764
|
|
6796
|
-
|
6797
|
-
|
6798
|
-
|
6799
|
-
while (pointer) {
|
6800
|
-
var listeners = pointer._listeners;
|
6801
|
-
if (listeners) {
|
6802
|
-
for (var index = 0; index < listeners.length - 3; index += 4) {
|
6803
|
-
names[listeners[index]] = true;
|
6804
|
-
}
|
6805
|
-
}
|
6806
|
-
if (pointer._listenersFinalized) {
|
6807
|
-
break;
|
6808
|
-
}
|
6809
|
-
pointer = pointer.parent;
|
6810
|
-
}
|
6811
|
-
return Object.keys(names);
|
6812
|
-
},
|
6765
|
+
function memberProperty(name) {
|
6766
|
+
return '_' + name;
|
6767
|
+
}
|
6813
6768
|
|
6814
|
-
|
6815
|
-
|
6816
|
-
|
6817
|
-
|
6818
|
-
|
6769
|
+
// there's a more general-purpose capitalize in ember-runtime, but we
|
6770
|
+
// don't want to make ember-metal depend on ember-runtime.
|
6771
|
+
function capitalize(name) {
|
6772
|
+
return name.replace(/^\w/, function (m) {
|
6773
|
+
return m.toUpperCase();
|
6774
|
+
});
|
6775
|
+
}
|
6776
|
+
|
6777
|
+
var META_DESC = {
|
6778
|
+
writable: true,
|
6779
|
+
configurable: true,
|
6780
|
+
enumerable: false,
|
6781
|
+
value: null
|
6819
6782
|
};
|
6820
6783
|
|
6821
|
-
exports.
|
6822
|
-
|
6823
|
-
|
6824
|
-
|
6825
|
-
|
6826
|
-
|
6827
|
-
|
6828
|
-
|
6784
|
+
exports.META_DESC = META_DESC;
|
6785
|
+
var EMBER_META_PROPERTY = {
|
6786
|
+
name: '__ember_meta__',
|
6787
|
+
descriptor: META_DESC
|
6788
|
+
};
|
6789
|
+
|
6790
|
+
// Placeholder for non-writable metas.
|
6791
|
+
var EMPTY_META = new Meta(null);
|
6792
|
+
|
6793
|
+
exports.EMPTY_META = EMPTY_META;
|
6794
|
+
|
6795
|
+
EMPTY_META.writableValues();
|
6796
|
+
|
6797
|
+
/**
|
6798
|
+
Retrieves the meta hash for an object. If `writable` is true ensures the
|
6799
|
+
hash is writable for this object as well.
|
6800
|
+
|
6801
|
+
The meta object contains information about computed property descriptors as
|
6802
|
+
well as any watched properties and other information. You generally will
|
6803
|
+
not access this information directly but instead work with higher level
|
6804
|
+
methods that manipulate this hash indirectly.
|
6805
|
+
|
6806
|
+
@method meta
|
6807
|
+
@for Ember
|
6808
|
+
@private
|
6809
|
+
|
6810
|
+
@param {Object} obj The object to retrieve meta for
|
6811
|
+
@param {Boolean} [writable=true] Pass `false` if you do not intend to modify
|
6812
|
+
the meta hash, allowing the method to avoid making an unnecessary copy.
|
6813
|
+
@return {Object} the meta hash for an object
|
6814
|
+
*/
|
6815
|
+
|
6816
|
+
function meta(obj, writable) {
|
6817
|
+
var ret = obj.__ember_meta__;
|
6818
|
+
if (writable === false) {
|
6819
|
+
return ret || EMPTY_META;
|
6829
6820
|
}
|
6830
|
-
|
6821
|
+
|
6822
|
+
if (ret && ret.source === obj) {
|
6823
|
+
return ret;
|
6824
|
+
}
|
6825
|
+
|
6826
|
+
if (!ret) {
|
6827
|
+
ret = new Meta(obj);
|
6828
|
+
|
6829
|
+
ret.writableValues();
|
6830
|
+
} else {
|
6831
|
+
ret = new Meta(obj, ret);
|
6832
|
+
}
|
6833
|
+
|
6834
|
+
if (obj.__defineNonEnumerable) {
|
6835
|
+
obj.__defineNonEnumerable(EMBER_META_PROPERTY);
|
6836
|
+
} else {
|
6837
|
+
Object.defineProperty(obj, '__ember_meta__', META_DESC);
|
6838
|
+
}
|
6839
|
+
obj.__ember_meta__ = ret;
|
6840
|
+
|
6841
|
+
return ret;
|
6831
6842
|
}
|
6832
6843
|
});
|
6833
6844
|
enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge', 'ember-metal/empty_object', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/binding', 'ember-metal/observer', 'ember-metal/events', 'ember-metal/streams/utils'], function (exports, _emberMetalCore, _emberMetalMerge, _emberMetalEmpty_object, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalProperties, _emberMetalComputed, _emberMetalBinding, _emberMetalObserver, _emberMetalEvents, _emberMetalStreamsUtils) {
|
@@ -6849,6 +6860,9 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
|
|
6849
6860
|
@submodule ember-metal
|
6850
6861
|
*/
|
6851
6862
|
|
6863
|
+
function ROOT() {}
|
6864
|
+
ROOT.__hasSuper = false;
|
6865
|
+
|
6852
6866
|
var REQUIRED;
|
6853
6867
|
var a_slice = [].slice;
|
6854
6868
|
|
@@ -6994,7 +7008,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
|
|
6994
7008
|
}
|
6995
7009
|
|
6996
7010
|
if (hasFunction) {
|
6997
|
-
newBase._super =
|
7011
|
+
newBase._super = ROOT;
|
6998
7012
|
}
|
6999
7013
|
|
7000
7014
|
return newBase;
|
@@ -7191,7 +7205,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
|
|
7191
7205
|
var keys = [];
|
7192
7206
|
var key, value, desc;
|
7193
7207
|
|
7194
|
-
obj._super =
|
7208
|
+
obj._super = ROOT;
|
7195
7209
|
|
7196
7210
|
// Go through all mixins and hashes passed in, and:
|
7197
7211
|
//
|
@@ -7569,7 +7583,7 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
|
|
7569
7583
|
@method aliasMethod
|
7570
7584
|
@for Ember
|
7571
7585
|
@param {String} methodName name of the method to alias
|
7572
|
-
@
|
7586
|
+
@public
|
7573
7587
|
*/
|
7574
7588
|
|
7575
7589
|
function aliasMethod(methodName) {
|
@@ -7758,6 +7772,75 @@ enifed('ember-metal/mixin', ['exports', 'ember-metal/core', 'ember-metal/merge',
|
|
7758
7772
|
exports.REQUIRED = REQUIRED;
|
7759
7773
|
});
|
7760
7774
|
// warn, assert, wrap, et;
|
7775
|
+
enifed('ember-metal/observer_set', ['exports', 'ember-metal/utils', 'ember-metal/events'], function (exports, _emberMetalUtils, _emberMetalEvents) {
|
7776
|
+
'use strict';
|
7777
|
+
|
7778
|
+
/*
|
7779
|
+
this.observerSet = {
|
7780
|
+
[senderGuid]: { // variable name: `keySet`
|
7781
|
+
[keyName]: listIndex
|
7782
|
+
}
|
7783
|
+
},
|
7784
|
+
this.observers = [
|
7785
|
+
{
|
7786
|
+
sender: obj,
|
7787
|
+
keyName: keyName,
|
7788
|
+
eventName: eventName,
|
7789
|
+
listeners: [
|
7790
|
+
[target, method, flags]
|
7791
|
+
]
|
7792
|
+
},
|
7793
|
+
...
|
7794
|
+
]
|
7795
|
+
*/
|
7796
|
+
exports.default = ObserverSet;
|
7797
|
+
|
7798
|
+
function ObserverSet() {
|
7799
|
+
this.clear();
|
7800
|
+
}
|
7801
|
+
|
7802
|
+
ObserverSet.prototype.add = function (sender, keyName, eventName) {
|
7803
|
+
var observerSet = this.observerSet;
|
7804
|
+
var observers = this.observers;
|
7805
|
+
var senderGuid = _emberMetalUtils.guidFor(sender);
|
7806
|
+
var keySet = observerSet[senderGuid];
|
7807
|
+
var index;
|
7808
|
+
|
7809
|
+
if (!keySet) {
|
7810
|
+
observerSet[senderGuid] = keySet = {};
|
7811
|
+
}
|
7812
|
+
index = keySet[keyName];
|
7813
|
+
if (index === undefined) {
|
7814
|
+
index = observers.push({
|
7815
|
+
sender: sender,
|
7816
|
+
keyName: keyName,
|
7817
|
+
eventName: eventName,
|
7818
|
+
listeners: []
|
7819
|
+
}) - 1;
|
7820
|
+
keySet[keyName] = index;
|
7821
|
+
}
|
7822
|
+
return observers[index].listeners;
|
7823
|
+
};
|
7824
|
+
|
7825
|
+
ObserverSet.prototype.flush = function () {
|
7826
|
+
var observers = this.observers;
|
7827
|
+
var i, len, observer, sender;
|
7828
|
+
this.clear();
|
7829
|
+
for (i = 0, len = observers.length; i < len; ++i) {
|
7830
|
+
observer = observers[i];
|
7831
|
+
sender = observer.sender;
|
7832
|
+
if (sender.isDestroying || sender.isDestroyed) {
|
7833
|
+
continue;
|
7834
|
+
}
|
7835
|
+
_emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
|
7836
|
+
}
|
7837
|
+
};
|
7838
|
+
|
7839
|
+
ObserverSet.prototype.clear = function () {
|
7840
|
+
this.observerSet = {};
|
7841
|
+
this.observers = [];
|
7842
|
+
};
|
7843
|
+
});
|
7761
7844
|
enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/events'], function (exports, _emberMetalWatching, _emberMetalEvents) {
|
7762
7845
|
'use strict';
|
7763
7846
|
|
@@ -7838,108 +7921,39 @@ enifed('ember-metal/observer', ['exports', 'ember-metal/watching', 'ember-metal/
|
|
7838
7921
|
_emberMetalWatching.watch(obj, path);
|
7839
7922
|
|
7840
7923
|
return this;
|
7841
|
-
}
|
7842
|
-
|
7843
|
-
// Suspend observer during callback.
|
7844
|
-
//
|
7845
|
-
// This should only be used by the target of the observer
|
7846
|
-
// while it is setting the observed path.
|
7847
|
-
|
7848
|
-
function _suspendObserver(obj, path, target, method, callback) {
|
7849
|
-
return _emberMetalEvents.suspendListener(obj, changeEvent(path), target, method, callback);
|
7850
|
-
}
|
7851
|
-
|
7852
|
-
function _suspendObservers(obj, paths, target, method, callback) {
|
7853
|
-
var events = paths.map(changeEvent);
|
7854
|
-
return _emberMetalEvents.suspendListeners(obj, events, target, method, callback);
|
7855
|
-
}
|
7856
|
-
|
7857
|
-
/**
|
7858
|
-
@method removeBeforeObserver
|
7859
|
-
@for Ember
|
7860
|
-
@param obj
|
7861
|
-
@param {String} path
|
7862
|
-
@param {Object|Function} target
|
7863
|
-
@param {Function|String} [method]
|
7864
|
-
@deprecated
|
7865
|
-
@private
|
7866
|
-
*/
|
7867
|
-
|
7868
|
-
function _removeBeforeObserver(obj, path, target, method) {
|
7869
|
-
_emberMetalWatching.unwatch(obj, path);
|
7870
|
-
_emberMetalEvents.removeListener(obj, beforeEvent(path), target, method);
|
7871
|
-
|
7872
|
-
return this;
|
7873
|
-
}
|
7874
|
-
});
|
7875
|
-
enifed('ember-metal/observer_set', ['exports', 'ember-metal/utils', 'ember-metal/events'], function (exports, _emberMetalUtils, _emberMetalEvents) {
|
7876
|
-
'use strict';
|
7877
|
-
|
7878
|
-
/*
|
7879
|
-
this.observerSet = {
|
7880
|
-
[senderGuid]: { // variable name: `keySet`
|
7881
|
-
[keyName]: listIndex
|
7882
|
-
}
|
7883
|
-
},
|
7884
|
-
this.observers = [
|
7885
|
-
{
|
7886
|
-
sender: obj,
|
7887
|
-
keyName: keyName,
|
7888
|
-
eventName: eventName,
|
7889
|
-
listeners: [
|
7890
|
-
[target, method, flags]
|
7891
|
-
]
|
7892
|
-
},
|
7893
|
-
...
|
7894
|
-
]
|
7895
|
-
*/
|
7896
|
-
exports.default = ObserverSet;
|
7924
|
+
}
|
7897
7925
|
|
7898
|
-
|
7899
|
-
|
7926
|
+
// Suspend observer during callback.
|
7927
|
+
//
|
7928
|
+
// This should only be used by the target of the observer
|
7929
|
+
// while it is setting the observed path.
|
7930
|
+
|
7931
|
+
function _suspendObserver(obj, path, target, method, callback) {
|
7932
|
+
return _emberMetalEvents.suspendListener(obj, changeEvent(path), target, method, callback);
|
7900
7933
|
}
|
7901
7934
|
|
7902
|
-
|
7903
|
-
var
|
7904
|
-
|
7905
|
-
|
7906
|
-
var keySet = observerSet[senderGuid];
|
7907
|
-
var index;
|
7935
|
+
function _suspendObservers(obj, paths, target, method, callback) {
|
7936
|
+
var events = paths.map(changeEvent);
|
7937
|
+
return _emberMetalEvents.suspendListeners(obj, events, target, method, callback);
|
7938
|
+
}
|
7908
7939
|
|
7909
|
-
|
7910
|
-
|
7911
|
-
|
7912
|
-
|
7913
|
-
|
7914
|
-
|
7915
|
-
|
7916
|
-
|
7917
|
-
|
7918
|
-
|
7919
|
-
}) - 1;
|
7920
|
-
keySet[keyName] = index;
|
7921
|
-
}
|
7922
|
-
return observers[index].listeners;
|
7923
|
-
};
|
7940
|
+
/**
|
7941
|
+
@method removeBeforeObserver
|
7942
|
+
@for Ember
|
7943
|
+
@param obj
|
7944
|
+
@param {String} path
|
7945
|
+
@param {Object|Function} target
|
7946
|
+
@param {Function|String} [method]
|
7947
|
+
@deprecated
|
7948
|
+
@private
|
7949
|
+
*/
|
7924
7950
|
|
7925
|
-
|
7926
|
-
|
7927
|
-
|
7928
|
-
this.clear();
|
7929
|
-
for (i = 0, len = observers.length; i < len; ++i) {
|
7930
|
-
observer = observers[i];
|
7931
|
-
sender = observer.sender;
|
7932
|
-
if (sender.isDestroying || sender.isDestroyed) {
|
7933
|
-
continue;
|
7934
|
-
}
|
7935
|
-
_emberMetalEvents.sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
|
7936
|
-
}
|
7937
|
-
};
|
7951
|
+
function _removeBeforeObserver(obj, path, target, method) {
|
7952
|
+
_emberMetalWatching.unwatch(obj, path);
|
7953
|
+
_emberMetalEvents.removeListener(obj, beforeEvent(path), target, method);
|
7938
7954
|
|
7939
|
-
|
7940
|
-
|
7941
|
-
this.observers = [];
|
7942
|
-
};
|
7955
|
+
return this;
|
7956
|
+
}
|
7943
7957
|
});
|
7944
7958
|
enifed('ember-metal/path_cache', ['exports', 'ember-metal/cache'], function (exports, _emberMetalCache) {
|
7945
7959
|
'use strict';
|
@@ -9566,61 +9580,6 @@ enifed('ember-metal/set_properties', ['exports', 'ember-metal/property_events',
|
|
9566
9580
|
return properties;
|
9567
9581
|
}
|
9568
9582
|
});
|
9569
|
-
enifed('ember-metal/streams/conditional', ['exports', 'ember-metal/streams/stream', 'ember-metal/streams/utils'], function (exports, _emberMetalStreamsStream, _emberMetalStreamsUtils) {
|
9570
|
-
'use strict';
|
9571
|
-
|
9572
|
-
exports.default = conditional;
|
9573
|
-
|
9574
|
-
function conditional(test, consequent, alternate) {
|
9575
|
-
if (_emberMetalStreamsUtils.isStream(test)) {
|
9576
|
-
return new ConditionalStream(test, consequent, alternate);
|
9577
|
-
} else {
|
9578
|
-
if (test) {
|
9579
|
-
return consequent;
|
9580
|
-
} else {
|
9581
|
-
return alternate;
|
9582
|
-
}
|
9583
|
-
}
|
9584
|
-
}
|
9585
|
-
|
9586
|
-
function ConditionalStream(test, consequent, alternate) {
|
9587
|
-
this.init();
|
9588
|
-
|
9589
|
-
this.oldTestResult = undefined;
|
9590
|
-
this.test = test;
|
9591
|
-
this.consequent = consequent;
|
9592
|
-
this.alternate = alternate;
|
9593
|
-
}
|
9594
|
-
|
9595
|
-
ConditionalStream.prototype = Object.create(_emberMetalStreamsStream.default.prototype);
|
9596
|
-
|
9597
|
-
ConditionalStream.prototype.compute = function () {
|
9598
|
-
var oldTestResult = this.oldTestResult;
|
9599
|
-
var newTestResult = !!_emberMetalStreamsUtils.read(this.test);
|
9600
|
-
|
9601
|
-
if (newTestResult !== oldTestResult) {
|
9602
|
-
switch (oldTestResult) {
|
9603
|
-
case true:
|
9604
|
-
_emberMetalStreamsUtils.unsubscribe(this.consequent, this.notify, this);break;
|
9605
|
-
case false:
|
9606
|
-
_emberMetalStreamsUtils.unsubscribe(this.alternate, this.notify, this);break;
|
9607
|
-
case undefined:
|
9608
|
-
_emberMetalStreamsUtils.subscribe(this.test, this.notify, this);
|
9609
|
-
}
|
9610
|
-
|
9611
|
-
switch (newTestResult) {
|
9612
|
-
case true:
|
9613
|
-
_emberMetalStreamsUtils.subscribe(this.consequent, this.notify, this);break;
|
9614
|
-
case false:
|
9615
|
-
_emberMetalStreamsUtils.subscribe(this.alternate, this.notify, this);
|
9616
|
-
}
|
9617
|
-
|
9618
|
-
this.oldTestResult = newTestResult;
|
9619
|
-
}
|
9620
|
-
|
9621
|
-
return newTestResult ? _emberMetalStreamsUtils.read(this.consequent) : _emberMetalStreamsUtils.read(this.alternate);
|
9622
|
-
};
|
9623
|
-
});
|
9624
9583
|
enifed('ember-metal/streams/dependency', ['exports', 'ember-metal/core', 'ember-metal/merge', 'ember-metal/streams/utils'], function (exports, _emberMetalCore, _emberMetalMerge, _emberMetalStreamsUtils) {
|
9625
9584
|
'use strict';
|
9626
9585
|
|
@@ -10379,7 +10338,7 @@ enifed('ember-metal/streams/utils', ['exports', 'ember-metal/core', './stream'],
|
|
10379
10338
|
});
|
10380
10339
|
|
10381
10340
|
for (i = 0, l = array.length; i < l; i++) {
|
10382
|
-
|
10341
|
+
stream.addDependency(array[i]);
|
10383
10342
|
}
|
10384
10343
|
|
10385
10344
|
// used by angle bracket components to detect an attribute was provided
|
@@ -10815,9 +10774,31 @@ enifed('ember-metal/utils', ['exports'], function (exports) {
|
|
10815
10774
|
}
|
10816
10775
|
}
|
10817
10776
|
|
10818
|
-
var
|
10819
|
-
|
10820
|
-
|
10777
|
+
var checkHasSuper = (function () {
|
10778
|
+
var sourceAvailable = (function () {
|
10779
|
+
return this;
|
10780
|
+
}).toString().indexOf('return this;') > -1;
|
10781
|
+
|
10782
|
+
if (sourceAvailable) {
|
10783
|
+
return function checkHasSuper(func) {
|
10784
|
+
return func.toString().indexOf('_super') > -1;
|
10785
|
+
};
|
10786
|
+
}
|
10787
|
+
|
10788
|
+
return function checkHasSuper() {
|
10789
|
+
return true;
|
10790
|
+
};
|
10791
|
+
})();
|
10792
|
+
|
10793
|
+
function ROOT() {}
|
10794
|
+
ROOT.__hasSuper = false;
|
10795
|
+
|
10796
|
+
function hasSuper(func) {
|
10797
|
+
if (func.__hasSuper === undefined) {
|
10798
|
+
func.__hasSuper = checkHasSuper(func);
|
10799
|
+
}
|
10800
|
+
return func.__hasSuper;
|
10801
|
+
}
|
10821
10802
|
|
10822
10803
|
/**
|
10823
10804
|
Wraps the passed function so that `this._super` will point to the superFunc
|
@@ -10832,36 +10813,24 @@ enifed('ember-metal/utils', ['exports'], function (exports) {
|
|
10832
10813
|
@return {Function} wrapped function.
|
10833
10814
|
*/
|
10834
10815
|
|
10835
|
-
function wrap(func,
|
10836
|
-
|
10837
|
-
|
10838
|
-
if (sourceAvailable) {
|
10839
|
-
hasSuper = func.__hasSuper;
|
10840
|
-
|
10841
|
-
if (hasSuper === undefined) {
|
10842
|
-
hasSuper = func.toString().indexOf('_super') > -1;
|
10843
|
-
func.__hasSuper = hasSuper;
|
10844
|
-
}
|
10845
|
-
|
10846
|
-
if (!hasSuper) {
|
10847
|
-
return func;
|
10848
|
-
}
|
10816
|
+
function wrap(func, superFunc) {
|
10817
|
+
if (!hasSuper(func)) {
|
10818
|
+
return func;
|
10849
10819
|
}
|
10850
|
-
|
10851
|
-
if (superFunc.wrappedFunction
|
10852
|
-
|
10853
|
-
superFunc = wrap(superFunc, function () {});
|
10820
|
+
// ensure an unwrapped super that calls _super is wrapped with a terminal _super
|
10821
|
+
if (!superFunc.wrappedFunction && hasSuper(superFunc)) {
|
10822
|
+
return _wrap(func, _wrap(superFunc, ROOT));
|
10854
10823
|
}
|
10855
|
-
|
10856
10824
|
return _wrap(func, superFunc);
|
10857
10825
|
}
|
10858
10826
|
|
10859
10827
|
function _wrap(func, superFunc) {
|
10860
10828
|
function superWrapper() {
|
10861
|
-
var ret;
|
10862
10829
|
var orig = this._super;
|
10830
|
+
var length = arguments.length;
|
10831
|
+
var ret = undefined;
|
10863
10832
|
this._super = superFunc;
|
10864
|
-
switch (
|
10833
|
+
switch (length) {
|
10865
10834
|
case 0:
|
10866
10835
|
ret = func.call(this);break;
|
10867
10836
|
case 1:
|
@@ -10875,7 +10844,14 @@ enifed('ember-metal/utils', ['exports'], function (exports) {
|
|
10875
10844
|
case 5:
|
10876
10845
|
ret = func.call(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);break;
|
10877
10846
|
default:
|
10878
|
-
|
10847
|
+
// v8 bug potentially incorrectly deopts this function: https://code.google.com/p/v8/issues/detail?id=3709
|
10848
|
+
// we may want to keep this around till this ages out on mobile
|
10849
|
+
var args = new Array(length);
|
10850
|
+
for (var x = 0; x < length; x++) {
|
10851
|
+
args[x] = arguments[x];
|
10852
|
+
}
|
10853
|
+
ret = func.apply(this, args);
|
10854
|
+
break;
|
10879
10855
|
}
|
10880
10856
|
this._super = orig;
|
10881
10857
|
return ret;
|
@@ -11350,7 +11326,7 @@ enifed('ember-metal/watching', ['exports', 'ember-metal/chains', 'ember-metal/wa
|
|
11350
11326
|
}
|
11351
11327
|
}
|
11352
11328
|
});
|
11353
|
-
enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-item-class', 'ember-template-compiler/plugins/transform-component-attrs-into-mut', 'ember-template-compiler/plugins/transform-component-curly-to-readonly', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-input-on-to-onEvent', 'ember-template-compiler/plugins/transform-top-level-components', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/assert-no-view-and-controller-paths', 'ember-template-compiler/plugins/assert-no-view-helper', 'ember-template-compiler/compat'], function (exports, _emberMetal, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate, _emberTemplateCompilerPlugins, _emberTemplateCompilerPluginsTransformOldBindingSyntax, _emberTemplateCompilerPluginsTransformOldClassBindingSyntax, _emberTemplateCompilerPluginsTransformItemClass, _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut, _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly, _emberTemplateCompilerPluginsTransformAngleBracketComponents, _emberTemplateCompilerPluginsTransformInputOnToOnEvent, _emberTemplateCompilerPluginsTransformTopLevelComponents, _emberTemplateCompilerPluginsTransformEachIntoCollection, _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths, _emberTemplateCompilerPluginsAssertNoViewHelper, _emberTemplateCompilerCompat) {
|
11329
|
+
enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/template', 'ember-template-compiler/plugins', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-item-class', 'ember-template-compiler/plugins/transform-component-attrs-into-mut', 'ember-template-compiler/plugins/transform-component-curly-to-readonly', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-input-on-to-onEvent', 'ember-template-compiler/plugins/transform-top-level-components', 'ember-template-compiler/plugins/transform-each-into-collection', 'ember-template-compiler/plugins/transform-unescaped-inline-link-to', 'ember-template-compiler/plugins/assert-no-view-and-controller-paths', 'ember-template-compiler/plugins/assert-no-view-helper', 'ember-template-compiler/compat'], function (exports, _emberMetal, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemTemplate, _emberTemplateCompilerPlugins, _emberTemplateCompilerPluginsTransformOldBindingSyntax, _emberTemplateCompilerPluginsTransformOldClassBindingSyntax, _emberTemplateCompilerPluginsTransformItemClass, _emberTemplateCompilerPluginsTransformComponentAttrsIntoMut, _emberTemplateCompilerPluginsTransformComponentCurlyToReadonly, _emberTemplateCompilerPluginsTransformAngleBracketComponents, _emberTemplateCompilerPluginsTransformInputOnToOnEvent, _emberTemplateCompilerPluginsTransformTopLevelComponents, _emberTemplateCompilerPluginsTransformEachIntoCollection, _emberTemplateCompilerPluginsTransformUnescapedInlineLinkTo, _emberTemplateCompilerPluginsAssertNoViewAndControllerPaths, _emberTemplateCompilerPluginsAssertNoViewHelper, _emberTemplateCompilerCompat) {
|
11354
11330
|
'use strict';
|
11355
11331
|
|
11356
11332
|
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformOldBindingSyntax.default);
|
@@ -11361,6 +11337,7 @@ enifed('ember-template-compiler', ['exports', 'ember-metal', 'ember-template-com
|
|
11361
11337
|
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformAngleBracketComponents.default);
|
11362
11338
|
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformInputOnToOnEvent.default);
|
11363
11339
|
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformTopLevelComponents.default);
|
11340
|
+
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformUnescapedInlineLinkTo.default);
|
11364
11341
|
|
11365
11342
|
if (_emberMetal.default.ENV._ENABLE_LEGACY_VIEW_SUPPORT) {
|
11366
11343
|
_emberTemplateCompilerPlugins.registerPlugin('ast', _emberTemplateCompilerPluginsTransformEachIntoCollection.default);
|
@@ -12267,6 +12244,36 @@ enifed('ember-template-compiler/plugins/transform-top-level-components', ['expor
|
|
12267
12244
|
|
12268
12245
|
exports.default = TransformTopLevelComponents;
|
12269
12246
|
});
|
12247
|
+
enifed('ember-template-compiler/plugins/transform-unescaped-inline-link-to', ['exports'], function (exports) {
|
12248
|
+
'use strict';
|
12249
|
+
|
12250
|
+
exports.default = TransformUnescapedInlineLinkTo;
|
12251
|
+
|
12252
|
+
function TransformUnescapedInlineLinkTo(options) {
|
12253
|
+
this.options = options;
|
12254
|
+
this.syntax = null;
|
12255
|
+
}
|
12256
|
+
|
12257
|
+
TransformUnescapedInlineLinkTo.prototype.transform = function TransformUnescapedInlineLinkTo_transform(ast) {
|
12258
|
+
var b = this.syntax.builders;
|
12259
|
+
var walker = new this.syntax.Walker();
|
12260
|
+
|
12261
|
+
walker.visit(ast, function (node) {
|
12262
|
+
if (!validate(node)) {
|
12263
|
+
return;
|
12264
|
+
}
|
12265
|
+
|
12266
|
+
node.escaped = true;
|
12267
|
+
node.params[0] = b.sexpr(b.string('-html-safe'), [node.params[0]]);
|
12268
|
+
});
|
12269
|
+
|
12270
|
+
return ast;
|
12271
|
+
};
|
12272
|
+
|
12273
|
+
function validate(node) {
|
12274
|
+
return node.type === 'MustacheStatement' && node.path.original === 'link-to' && !node.escaped;
|
12275
|
+
}
|
12276
|
+
});
|
12270
12277
|
enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {
|
12271
12278
|
'use strict';
|
12272
12279
|
|
@@ -12300,41 +12307,6 @@ enifed('ember-template-compiler/system/calculate-location-display', ['exports'],
|
|
12300
12307
|
return moduleInfo;
|
12301
12308
|
}
|
12302
12309
|
});
|
12303
|
-
enifed('ember-template-compiler/system/compile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options', 'ember-template-compiler/system/template'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
|
12304
|
-
/**
|
12305
|
-
@module ember
|
12306
|
-
@submodule ember-template-compiler
|
12307
|
-
*/
|
12308
|
-
|
12309
|
-
'use strict';
|
12310
|
-
|
12311
|
-
var compile;
|
12312
|
-
|
12313
|
-
/**
|
12314
|
-
Uses HTMLBars `compile` function to process a string into a compiled template.
|
12315
|
-
|
12316
|
-
This is not present in production builds.
|
12317
|
-
|
12318
|
-
@private
|
12319
|
-
@method compile
|
12320
|
-
@param {String} templateString This is the string to be compiled by HTMLBars.
|
12321
|
-
@param {Object} options This is an options hash to augment the compiler options.
|
12322
|
-
*/
|
12323
|
-
|
12324
|
-
exports.default = function (templateString, options) {
|
12325
|
-
if (!compile && _emberMetalCore.default.__loader.registry['htmlbars-compiler/compiler']) {
|
12326
|
-
compile = requireModule('htmlbars-compiler/compiler').compile;
|
12327
|
-
}
|
12328
|
-
|
12329
|
-
if (!compile) {
|
12330
|
-
throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
|
12331
|
-
}
|
12332
|
-
|
12333
|
-
var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options.default(options));
|
12334
|
-
|
12335
|
-
return _emberTemplateCompilerSystemTemplate.default(templateSpec);
|
12336
|
-
};
|
12337
|
-
});
|
12338
12310
|
enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-metal/features', 'ember-metal/assign', 'ember-template-compiler/plugins'], function (exports, _emberMetalFeatures, _emberMetalAssign, _emberTemplateCompilerPlugins) {
|
12339
12311
|
/**
|
12340
12312
|
@module ember
|
@@ -12375,7 +12347,7 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
|
|
12375
12347
|
options.buildMeta = function buildMeta(program) {
|
12376
12348
|
return {
|
12377
12349
|
topLevel: detectTopLevel(program),
|
12378
|
-
revision: 'Ember@2.1.0-beta.
|
12350
|
+
revision: 'Ember@2.1.0-beta.3',
|
12379
12351
|
loc: program.loc,
|
12380
12352
|
moduleName: options.moduleName
|
12381
12353
|
};
|
@@ -12430,6 +12402,41 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
|
|
12430
12402
|
return null;
|
12431
12403
|
}
|
12432
12404
|
});
|
12405
|
+
enifed('ember-template-compiler/system/compile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options', 'ember-template-compiler/system/template'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options, _emberTemplateCompilerSystemTemplate) {
|
12406
|
+
/**
|
12407
|
+
@module ember
|
12408
|
+
@submodule ember-template-compiler
|
12409
|
+
*/
|
12410
|
+
|
12411
|
+
'use strict';
|
12412
|
+
|
12413
|
+
var compile;
|
12414
|
+
|
12415
|
+
/**
|
12416
|
+
Uses HTMLBars `compile` function to process a string into a compiled template.
|
12417
|
+
|
12418
|
+
This is not present in production builds.
|
12419
|
+
|
12420
|
+
@private
|
12421
|
+
@method compile
|
12422
|
+
@param {String} templateString This is the string to be compiled by HTMLBars.
|
12423
|
+
@param {Object} options This is an options hash to augment the compiler options.
|
12424
|
+
*/
|
12425
|
+
|
12426
|
+
exports.default = function (templateString, options) {
|
12427
|
+
if (!compile && _emberMetalCore.default.__loader.registry['htmlbars-compiler/compiler']) {
|
12428
|
+
compile = requireModule('htmlbars-compiler/compiler').compile;
|
12429
|
+
}
|
12430
|
+
|
12431
|
+
if (!compile) {
|
12432
|
+
throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
|
12433
|
+
}
|
12434
|
+
|
12435
|
+
var templateSpec = compile(templateString, _emberTemplateCompilerSystemCompile_options.default(options));
|
12436
|
+
|
12437
|
+
return _emberTemplateCompilerSystemTemplate.default(templateSpec);
|
12438
|
+
};
|
12439
|
+
});
|
12433
12440
|
enifed('ember-template-compiler/system/precompile', ['exports', 'ember-metal/core', 'ember-template-compiler/system/compile_options'], function (exports, _emberMetalCore, _emberTemplateCompilerSystemCompile_options) {
|
12434
12441
|
/**
|
12435
12442
|
@module ember
|
@@ -13868,7 +13875,6 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
13868
13875
|
|
13869
13876
|
exports.wrap = wrap;
|
13870
13877
|
exports.wrapForHelper = wrapForHelper;
|
13871
|
-
exports.hostYieldWithShadowTemplate = hostYieldWithShadowTemplate;
|
13872
13878
|
exports.createScope = createScope;
|
13873
13879
|
exports.createFreshScope = createFreshScope;
|
13874
13880
|
exports.bindShadowScope = bindShadowScope;
|
@@ -13895,6 +13901,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
13895
13901
|
exports.subexpr = subexpr;
|
13896
13902
|
exports.get = get;
|
13897
13903
|
exports.getRoot = getRoot;
|
13904
|
+
exports.getBlock = getBlock;
|
13898
13905
|
exports.getChild = getChild;
|
13899
13906
|
exports.getValue = getValue;
|
13900
13907
|
exports.getCellOrValue = getCellOrValue;
|
@@ -14000,9 +14007,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14000
14007
|
|
14001
14008
|
function wrapForHelper(template, env, scope, morph, renderState, visitor) {
|
14002
14009
|
if (!template) {
|
14003
|
-
return {
|
14004
|
-
yieldIn: yieldInShadowTemplate(null, env, scope, morph, renderState, visitor)
|
14005
|
-
};
|
14010
|
+
return {};
|
14006
14011
|
}
|
14007
14012
|
|
14008
14013
|
var yieldArgs = yieldTemplate(template, env, scope, morph, renderState, visitor);
|
@@ -14012,7 +14017,6 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14012
14017
|
arity: template.arity,
|
14013
14018
|
yield: yieldArgs,
|
14014
14019
|
yieldItem: yieldItem(template, env, scope, morph, renderState, visitor),
|
14015
|
-
yieldIn: yieldInShadowTemplate(template, env, scope, morph, renderState, visitor),
|
14016
14020
|
raw: template,
|
14017
14021
|
|
14018
14022
|
render: function (self, blockArguments) {
|
@@ -14179,55 +14183,6 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14179
14183
|
function isStableTemplate(template, lastYielded) {
|
14180
14184
|
return !lastYielded.shadowTemplate && template === lastYielded.template;
|
14181
14185
|
}
|
14182
|
-
|
14183
|
-
function yieldInShadowTemplate(template, env, parentScope, morph, renderState, visitor) {
|
14184
|
-
var hostYield = hostYieldWithShadowTemplate(template, env, parentScope, morph, renderState, visitor);
|
14185
|
-
|
14186
|
-
return function (shadowTemplate, self) {
|
14187
|
-
hostYield(shadowTemplate, env, self, []);
|
14188
|
-
};
|
14189
|
-
}
|
14190
|
-
|
14191
|
-
function hostYieldWithShadowTemplate(template, env, parentScope, morph, renderState, visitor) {
|
14192
|
-
return function (shadowTemplate, env, self, blockArguments) {
|
14193
|
-
renderState.morphToClear = null;
|
14194
|
-
|
14195
|
-
if (morph.lastYielded && isStableShadowRoot(template, shadowTemplate, morph.lastYielded)) {
|
14196
|
-
return morph.lastResult.revalidateWith(env, undefined, self, blockArguments, visitor);
|
14197
|
-
}
|
14198
|
-
|
14199
|
-
var shadowScope = env.hooks.createFreshScope();
|
14200
|
-
env.hooks.bindShadowScope(env, parentScope, shadowScope, renderState.shadowOptions);
|
14201
|
-
blockToYield.arity = template.arity;
|
14202
|
-
env.hooks.bindBlock(env, shadowScope, blockToYield);
|
14203
|
-
|
14204
|
-
morph.lastYielded = { self: self, template: template, shadowTemplate: shadowTemplate };
|
14205
|
-
|
14206
|
-
// Render the shadow template with the block available
|
14207
|
-
_render.default(shadowTemplate.raw, env, shadowScope, { renderNode: morph, self: self, blockArguments: blockArguments });
|
14208
|
-
};
|
14209
|
-
|
14210
|
-
function blockToYield(env, blockArguments, self, renderNode, shadowParent, visitor) {
|
14211
|
-
if (renderNode.lastResult) {
|
14212
|
-
renderNode.lastResult.revalidateWith(env, undefined, undefined, blockArguments, visitor);
|
14213
|
-
} else {
|
14214
|
-
var scope = parentScope;
|
14215
|
-
|
14216
|
-
// Since a yielded template shares a `self` with its original context,
|
14217
|
-
// we only need to create a new scope if the template has block parameters
|
14218
|
-
if (template.arity) {
|
14219
|
-
scope = env.hooks.createChildScope(parentScope);
|
14220
|
-
}
|
14221
|
-
|
14222
|
-
_render.default(template, env, scope, { renderNode: renderNode, self: self, blockArguments: blockArguments });
|
14223
|
-
}
|
14224
|
-
}
|
14225
|
-
}
|
14226
|
-
|
14227
|
-
function isStableShadowRoot(template, shadowTemplate, lastYielded) {
|
14228
|
-
return template === lastYielded.template && shadowTemplate === lastYielded.shadowTemplate;
|
14229
|
-
}
|
14230
|
-
|
14231
14186
|
function optionsFor(template, inverse, env, scope, morph, visitor) {
|
14232
14187
|
// If there was a template yielded last time, set morphToClear so it will be cleared
|
14233
14188
|
// if no template is yielded on this render.
|
@@ -14740,20 +14695,23 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14740
14695
|
// scopes; it should not be provided to user code.
|
14741
14696
|
|
14742
14697
|
var to = env.hooks.getValue(hash.to) || 'default';
|
14743
|
-
|
14744
|
-
|
14698
|
+
var block = env.hooks.getBlock(scope, to);
|
14699
|
+
|
14700
|
+
if (block) {
|
14701
|
+
block.invoke(env, params, hash.self, morph, scope, visitor);
|
14745
14702
|
}
|
14746
14703
|
return true;
|
14747
14704
|
},
|
14748
14705
|
|
14749
14706
|
hasBlock: function (morph, env, scope, params) {
|
14750
14707
|
var name = env.hooks.getValue(params[0]) || 'default';
|
14751
|
-
return !!scope
|
14708
|
+
return !!env.hooks.getBlock(scope, name);
|
14752
14709
|
},
|
14753
14710
|
|
14754
14711
|
hasBlockParams: function (morph, env, scope, params) {
|
14755
14712
|
var name = env.hooks.getValue(params[0]) || 'default';
|
14756
|
-
|
14713
|
+
var block = env.hooks.getBlock(scope, name);
|
14714
|
+
return !!(block && block.arity);
|
14757
14715
|
}
|
14758
14716
|
|
14759
14717
|
};
|
@@ -14953,6 +14911,10 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
14953
14911
|
}
|
14954
14912
|
}
|
14955
14913
|
|
14914
|
+
function getBlock(scope, key) {
|
14915
|
+
return scope.blocks[key];
|
14916
|
+
}
|
14917
|
+
|
14956
14918
|
function getChild(value, key) {
|
14957
14919
|
return value[key];
|
14958
14920
|
}
|
@@ -15019,6 +14981,7 @@ enifed("htmlbars-runtime/hooks", ["exports", "./render", "../morph-range/morph-l
|
|
15019
14981
|
createFreshScope: createFreshScope,
|
15020
14982
|
getChild: getChild,
|
15021
14983
|
getRoot: getRoot,
|
14984
|
+
getBlock: getBlock,
|
15022
14985
|
getValue: getValue,
|
15023
14986
|
getCellOrValue: getCellOrValue,
|
15024
14987
|
keywords: keywords,
|
@@ -15345,11 +15308,6 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
|
|
15345
15308
|
|
15346
15309
|
this.bindScope();
|
15347
15310
|
|
15348
|
-
if (options.attributes !== undefined) {
|
15349
|
-
nodes.push({ state: {} });
|
15350
|
-
this.statements.push(['attributes', attachAttributes(options.attributes)]);
|
15351
|
-
}
|
15352
|
-
|
15353
15311
|
if (options.self !== undefined) {
|
15354
15312
|
this.bindSelf(options.self);
|
15355
15313
|
}
|
@@ -15589,8 +15547,6 @@ enifed("htmlbars-runtime/render", ["exports", "../htmlbars-util/array-utils", ".
|
|
15589
15547
|
visitor.attribute(statement, morph, env, scope);break;
|
15590
15548
|
case 'component':
|
15591
15549
|
visitor.component(statement, morph, env, scope, template, visitor);break;
|
15592
|
-
case 'attributes':
|
15593
|
-
visitor.attributes(statement, morph, env, scope, this.fragment, visitor);break;
|
15594
15550
|
}
|
15595
15551
|
|
15596
15552
|
if (env.hooks.didRenderNode) {
|
@@ -18843,7 +18799,12 @@ enifed("htmlbars-util/morph-utils", ["exports"], function (exports) {
|
|
18843
18799
|
current = current.nextMorph;
|
18844
18800
|
}
|
18845
18801
|
} else if (node.morphList) {
|
18846
|
-
|
18802
|
+
var current = node.morphList.firstChildMorph;
|
18803
|
+
|
18804
|
+
while (current) {
|
18805
|
+
nodes.push(current);
|
18806
|
+
current = current.nextMorph;
|
18807
|
+
}
|
18847
18808
|
}
|
18848
18809
|
}
|
18849
18810
|
}
|
@@ -19051,44 +19012,54 @@ enifed("htmlbars-util/template-utils", ["exports", "../htmlbars-util/morph-utils
|
|
19051
19012
|
this.shadowOptions = null;
|
19052
19013
|
}
|
19053
19014
|
|
19054
|
-
function
|
19055
|
-
|
19056
|
-
|
19057
|
-
|
19058
|
-
|
19015
|
+
function Block(render, template, blockOptions) {
|
19016
|
+
this.render = render;
|
19017
|
+
this.template = template;
|
19018
|
+
this.blockOptions = blockOptions;
|
19019
|
+
this.arity = template.arity;
|
19020
|
+
}
|
19021
|
+
|
19022
|
+
Block.prototype.invoke = function (env, blockArguments, self, renderNode, parentScope, visitor) {
|
19023
|
+
var _this = this;
|
19024
|
+
|
19025
|
+
if (renderNode.lastResult) {
|
19026
|
+
renderNode.lastResult.revalidateWith(env, undefined, self, blockArguments, visitor);
|
19027
|
+
} else {
|
19028
|
+
(function () {
|
19059
19029
|
var options = { renderState: new RenderState(renderNode) };
|
19030
|
+
var render = _this.render;
|
19031
|
+
var template = _this.template;
|
19032
|
+
var scope = _this.blockOptions.scope;
|
19060
19033
|
|
19061
|
-
var scope = blockOptions.scope;
|
19062
19034
|
var shadowScope = scope ? env.hooks.createChildScope(scope) : env.hooks.createFreshScope();
|
19063
|
-
var attributes = blockOptions.attributes;
|
19064
19035
|
|
19065
|
-
env.hooks.bindShadowScope(env, parentScope, shadowScope, blockOptions.options);
|
19036
|
+
env.hooks.bindShadowScope(env, parentScope, shadowScope, _this.blockOptions.options);
|
19066
19037
|
|
19067
19038
|
if (self !== undefined) {
|
19068
19039
|
env.hooks.bindSelf(env, shadowScope, self);
|
19069
|
-
} else if (blockOptions.self !== undefined) {
|
19070
|
-
env.hooks.bindSelf(env, shadowScope, blockOptions.self);
|
19040
|
+
} else if (_this.blockOptions.self !== undefined) {
|
19041
|
+
env.hooks.bindSelf(env, shadowScope, _this.blockOptions.self);
|
19071
19042
|
}
|
19072
19043
|
|
19073
|
-
bindBlocks(env, shadowScope, blockOptions.yieldTo);
|
19044
|
+
bindBlocks(env, shadowScope, _this.blockOptions.yieldTo);
|
19074
19045
|
|
19075
19046
|
renderAndCleanup(renderNode, env, options, null, function () {
|
19076
19047
|
options.renderState.morphToClear = null;
|
19077
|
-
render(template, env, shadowScope, { renderNode: renderNode, blockArguments: blockArguments
|
19048
|
+
render(template, env, shadowScope, { renderNode: renderNode, blockArguments: blockArguments });
|
19078
19049
|
});
|
19079
|
-
}
|
19080
|
-
}
|
19081
|
-
|
19082
|
-
block.arity = template.arity;
|
19050
|
+
})();
|
19051
|
+
}
|
19052
|
+
};
|
19083
19053
|
|
19084
|
-
|
19054
|
+
function blockFor(render, template, blockOptions) {
|
19055
|
+
return new Block(render, template, blockOptions);
|
19085
19056
|
}
|
19086
19057
|
|
19087
19058
|
function bindBlocks(env, shadowScope, blocks) {
|
19088
19059
|
if (!blocks) {
|
19089
19060
|
return;
|
19090
19061
|
}
|
19091
|
-
if (
|
19062
|
+
if (blocks instanceof Block) {
|
19092
19063
|
env.hooks.bindBlock(env, shadowScope, blocks);
|
19093
19064
|
} else {
|
19094
19065
|
for (var name in blocks) {
|