Suppose I have the following property:
cat: (->
if @attack?
@get 'dependencyA'
else
@get 'dependencyB'
).property('dependencyA', 'dependencyB')
If the condition @attack? is self-dependent (it is; it just checks for function existence) and resolves to true, the property will always be dependent only on dependencyA and not on dependencyB. However if dependencyB changes, the property cat will have to be computed again.
So what I want is to do the following, but perhaps in a more idiomatic way:
_init: ->
# ...
descriptors = (Ember.meta @proto()).descs
catDescriptor = descriptors['cat']
if @attack?
catDescriptor.willWatch 'dependencyA'
catDescriptor.didUnwatch 'dependencyB'
else
catDescriptor.didUnwatch 'dependencyA'
catDescriptor.willWatch 'dependencyB'
Edit: willWatch / didUnwatch source:
/* impl descriptor API */
ComputedPropertyPrototype.willWatch = function(obj, keyName) {
// watch already creates meta for this instance
var meta = obj[META_KEY];
Ember.assert('watch should have setup meta to be writable', meta.source === obj);
if (!(keyName in meta.cache)) {
addDependentKeys(this, obj, keyName, meta);
}
};
ComputedPropertyPrototype.didUnwatch = function(obj, keyName) {
var meta = obj[META_KEY];
Ember.assert('unwatch should have setup meta to be writable', meta.source === obj);
if (!(keyName in meta.cache)) {
// unwatch already creates meta for this instance
removeDependentKeys(this, obj, keyName, meta);
}
};