/**
* This class manages stubs associated with `link` requests. These bind to some other
* descriptor and forward changes from there.
* @private
*/
Ext.define('Ext.app.bind.LinkStub', {
extend: 'Ext.app.bind.Stub',
isLinkStub: true,
binding: null,
destroy: function() {
var me = this,
binding = me.binding,
owner = me.owner;
if (binding) {
me.binding = null;
binding.destroy();
if (owner) {
delete owner.linkData[me.name];
}
}
me.target = null;
me.callParent();
},
getFullName: function() {
var me = this;
return me.fullName ||
(me.fullName = '(' + me.callParent() + ' -> ' + me.binding.getFullName() + ')');
},
getDataObject: function() {
var binding = this.binding,
root = this.parent,
name = this.name,
rootData, ret;
if (root.isRootStub && !root.shouldClimb(name)) {
rootData = root.owner.getData();
if (!rootData.hasOwnProperty(name)) {
rootData[name] = ret = {};
}
}
else {
ret = binding && binding.getDataObject();
}
return ret;
},
getRawValue: function() {
var binding = this.binding;
return binding && binding.getRawValue();
},
getValue: function() {
var binding = this.binding;
return binding && binding.getValue();
},
getTargetStub: function() {
var binding = this.binding;
return binding && binding.stub;
},
isAvailable: function() {
var binding = this.binding;
return binding ? binding.isAvailable() : false;
},
isLoading: function() {
var binding = this.binding;
return binding ? binding.isLoading() : false;
},
link: function(bindDescriptor, target) {
var me = this,
binding = me.binding;
if (binding) {
binding.destroy();
}
target = me.target = target || me.owner;
me.linkDescriptor = bindDescriptor;
me.binding = target.bind(bindDescriptor, me.onChange, me);
me.binding.deep = true;
},
onChange: function() {
this.invalidate(true);
},
react: function() {
var me = this,
linkData = me.owner.linkData;
linkData[me.name] = me.getValue();
me.callParent();
},
privates: {
collect: function() {
var me = this,
result = me.callParent(),
binding = me.binding ? 1 : 0;
return result + binding;
},
sort: function() {
var binding = this.binding;
if (binding) {
// We want to make sure our binding reacts before we do so that it can provide
// whatever value we might need first.
this.scheduler.sortItem(binding);
}
}
}
});