diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/service/parse.js | 29 | 
1 files changed, 24 insertions, 5 deletions
| diff --git a/src/service/parse.js b/src/service/parse.js index 432929b5..3a6c4106 100644 --- a/src/service/parse.js +++ b/src/service/parse.js @@ -522,9 +522,21 @@ function parser(text, json, $filter){      consume(']');      return extend(        function(self){ -        var o = obj(self); -        var i = indexFn(self); -        return (o) ? o[i] : undefined; +        var o = obj(self), +            i = indexFn(self), +            v, p; + +        if (!o) return undefined; +        v = o[i]; +        if (v && v.then) { +          p = v; +          if (!('$$v' in v)) { +            p.$$v = undefined; +            p.then(function(val) { p.$$v = val; }); +          } +          v = v.$$v; +        } +        return v;        }, {          assign:function(self, value){            return obj(self)[indexFn(self)] = value; @@ -673,7 +685,7 @@ function getterFn(path) {    var fn = getterFnCache[path];    if (fn) return fn; -  var code = 'var l, fn, t;\n'; +  var code = 'var l, fn, p;\n';    forEach(path.split('.'), function(key) {      key = (JS_KEYWORDS[key]) ? '["' + key + '"]' : '.' + key;      code += 'if(!s) return s;\n' + @@ -683,11 +695,18 @@ function getterFn(path) {                ' fn=function(){ return l' + key + '.apply(l, arguments); };\n' +                ' fn.$unboundFn=s;\n' +                ' s=fn;\n' + +            '} else if (s && s.then) {\n' + +              ' if (!("$$v" in s)) {\n' + +                ' p=s;\n' + +                ' p.$$v = undefined;\n' + +                ' p.then(function(v) {p.$$v=v;});\n' + +                '}\n' + +              ' s=s.$$v\n' +              '}\n';    });    code += 'return s;';    fn = Function('s', code); -  fn["toString"] = function() { return code; }; +  fn.toString = function() { return code; };    return getterFnCache[path] = fn;  } | 
