/**
* This class is created to manage a template against a `ViewModel`. A binding of this
* type uses `{@link Ext.app.bind.Template}` to process the template text so see that
* class for details on template syntax.
*
* The bindings to provide the data needed by the template are managed here.
*/
Ext.define('Ext.app.bind.TemplateBinding', {
extend: 'Ext.app.bind.BaseBinding',
requires: [
'Ext.app.bind.Multi',
'Ext.app.bind.Template'
],
isTemplateBinding: true,
lastValue: undefined,
value: undefined,
constructor: function(template, owner, callback, scope, options) {
var me = this,
tpl = new Ext.app.bind.Template(template),
tokens = tpl.getTokens();
me.callParent([ owner, callback, scope, options ]);
me.tpl = tpl;
me.tokens = tokens;
tokens.$literal = true;
// If we don't have any tokens, then we've just got a static string.
if (!tpl.isStatic()) {
me.multiBinding = new Ext.app.bind.Multi(tokens, owner, me.onBindData, me);
}
else {
me.isStatic = true;
me.onData(tpl.getText());
}
},
destroy: function() {
var me = this;
Ext.destroy(me.multiBinding);
me.tpl = me.multiBinding = null;
me.callParent();
},
getFullName: function() {
var multi = this.multiBinding;
return this.fullName ||
(this.fullName = '$' + (multi ? multi.getFullName() : this.callParent()));
},
getRawValue: function() {
return this.value;
},
getTemplateScope: function() {
return null;
},
isAvailable: function() {
var multi = this.multiBinding;
return multi ? multi.isAvailable() : false;
},
isDescendantOf: function() {
return false;
},
isLoading: function() {
var multi = this.multiBinding;
return multi ? multi.isLoading() : false;
},
onBindData: function(data) {
this.onData(this.tpl.apply(data, this.getTemplateScope()));
},
onData: function(value) {
var me = this,
lastValue = me.value;
if (lastValue !== (me.value = value)) {
me.lastValue = lastValue;
me.schedule();
}
},
react: function() {
this.notify(this.value);
},
refresh: function() {
var multi = this.multiBinding;
if (multi) {
multi.refresh();
}
},
privates: {
sort: function() {
var multi = this.multiBinding;
if (multi) {
this.scheduler.sortItem(multi);
}
// Schedulable#sort === emptyFn
// me.callParent();
}
}
});