145 lines
2.4 KiB
JavaScript
145 lines
2.4 KiB
JavaScript
|
|
||
|
var VnObject = require ('./object');
|
||
|
|
||
|
var regex = /{{[\w_]+(\.[\w_]+)?}}/g;
|
||
|
|
||
|
/**
|
||
|
* Replaces all ocurrences of {{value}} by it's corresponding value in the
|
||
|
* scope lot.
|
||
|
*/
|
||
|
module.exports = new Class
|
||
|
({
|
||
|
Extends: VnObject
|
||
|
|
||
|
,_lots: {}
|
||
|
,_links: []
|
||
|
|
||
|
,initialize: function (builder)
|
||
|
{
|
||
|
this._builder = builder;
|
||
|
this.parent ();
|
||
|
}
|
||
|
|
||
|
,compile: function (objContext, data, string)
|
||
|
{
|
||
|
var matchs = string.match (regex);
|
||
|
|
||
|
if (!matchs)
|
||
|
return null;
|
||
|
|
||
|
var lots = this._lots;
|
||
|
var links = this._links;
|
||
|
|
||
|
var regLots = {};
|
||
|
var params = [];
|
||
|
|
||
|
var context = {
|
||
|
objContext: objContext,
|
||
|
data: data,
|
||
|
string: string,
|
||
|
params: params
|
||
|
};
|
||
|
|
||
|
for (var i = 0; i < matchs.length; i++)
|
||
|
{
|
||
|
var match = matchs[i];
|
||
|
match = matchs[i].substr (2, match.length - 4);
|
||
|
match = match.split ('.');
|
||
|
|
||
|
var lotId;
|
||
|
var name;
|
||
|
|
||
|
if (match.length > 1)
|
||
|
{
|
||
|
lotId = match[0];
|
||
|
name = match[1];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lotId = null;
|
||
|
name = match[0];
|
||
|
}
|
||
|
|
||
|
params.push ({
|
||
|
lotId: lotId,
|
||
|
name: name
|
||
|
});
|
||
|
|
||
|
if (regLots[lotId] === undefined)
|
||
|
{
|
||
|
if (!lots[lotId])
|
||
|
lots[lotId] = [];
|
||
|
|
||
|
lots[lotId].push (context);
|
||
|
regLots[lotId] = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
links.push (context);
|
||
|
return context;
|
||
|
}
|
||
|
|
||
|
,interpolate: function (link, scope)
|
||
|
{
|
||
|
var i = 0;
|
||
|
var params = link.params;
|
||
|
var $ = scope.$;
|
||
|
|
||
|
return link.string.replace (regex, function () {
|
||
|
var param = params[i++];
|
||
|
var lotId = param.lotId;
|
||
|
var lot = lotId ? $[lotId] : scope.lot;
|
||
|
var value = lot ? lot.$[param.name] : null;
|
||
|
return value != null ? value : '';
|
||
|
});
|
||
|
}
|
||
|
|
||
|
,preLink: function (scope)
|
||
|
{
|
||
|
this._link (this._links, scope);
|
||
|
}
|
||
|
|
||
|
,_link: function (links, scope)
|
||
|
{
|
||
|
for (var i = 0; i < links.length; i++)
|
||
|
{
|
||
|
var link = links[i];
|
||
|
var string = this.interpolate (link, scope);
|
||
|
var object = scope.objects[link.objContext.id];
|
||
|
link.objContext.compiler.setProperty (object, link.data, string);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
,getLot: function (lotId, scope)
|
||
|
{
|
||
|
return lotId == 'null' ? scope.lot : scope.$[lotId];
|
||
|
}
|
||
|
|
||
|
,postLink: function (scope)
|
||
|
{
|
||
|
for (var lotId in this._lots)
|
||
|
{
|
||
|
var lot = this.getLot (lotId, scope);
|
||
|
|
||
|
if (lot)
|
||
|
lot.on ('change', this.onLotChange.bind (this, lotId, scope), scope);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
,free: function (scope)
|
||
|
{
|
||
|
for (var lotId in this._lots)
|
||
|
{
|
||
|
var lot = this.getLot (lotId, scope);
|
||
|
|
||
|
if (lot)
|
||
|
lot.disconnectByInstance (scope);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
,onLotChange: function (lotId, scope)
|
||
|
{
|
||
|
this._link (this._lots[lotId], scope);
|
||
|
}
|
||
|
});
|