diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Angular.js | 6 | ||||
| -rw-r--r-- | src/Compiler.js | 4 | ||||
| -rw-r--r-- | src/Scope.js | 40 | ||||
| -rw-r--r-- | src/directives.js | 2 | ||||
| -rw-r--r-- | src/widgets.js | 14 | 
5 files changed, 52 insertions, 14 deletions
| diff --git a/src/Angular.js b/src/Angular.js index 7ea43c98..ef1187f2 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -124,9 +124,9 @@ function jqLiteWrap(element) {  }  function isUndefined(value){ return typeof value == $undefined; }  function isDefined(value){ return typeof value != $undefined; } -function isObject(value){ return value!=_null && typeof value == 'object';} -function isString(value){ return typeof value == 'string';} -function isNumber(value){ return typeof value == 'number';} +function isObject(value){ return value!=_null && typeof value == $object;} +function isString(value){ return typeof value == $string;} +function isNumber(value){ return typeof value == $number;}  function isArray(value) { return value instanceof Array; }  function isFunction(value){ return typeof value == $function;}  function isTextNode(node) { return nodeName(node) == '#text'; } diff --git a/src/Compiler.js b/src/Compiler.js index c45dd46e..6252e0c4 100644 --- a/src/Compiler.js +++ b/src/Compiler.js @@ -8,7 +8,7 @@ function Template(priority) {    this.paths = [];    this.children = [];    this.inits = []; -  this.priority = priority || 0; +  this.priority = priority;  }  Template.prototype = { @@ -130,7 +130,7 @@ Compiler.prototype = {        priority = priority || 0;      }      if (isString(priority)) { -      priority = PRIORITY[uppercase(priority)] || 0; +      priority = PRIORITY[uppercase(priority)] || parseInt(priority);      }      template = new Template(priority);      eachAttribute(element, function(value, name){ diff --git a/src/Scope.js b/src/Scope.js index c2a4f098..53228a0d 100644 --- a/src/Scope.js +++ b/src/Scope.js @@ -22,7 +22,7 @@ function getter(instance, path, unboundFn) {        }      }    } -  if (!unboundFn && isFunction(instance) && !instance['$$factory']) { +  if (!unboundFn && isFunction(instance)) {      return bind(lastInstance, instance);    }    return instance; @@ -113,12 +113,13 @@ function createScope(parent, services, existing) {    function API(){}    function Behavior(){} -  var instance, behavior, api, evalLists = {sorted:[]}, servicesCache = extend({}, existing); -    parent = Parent.prototype = (parent || {}); -  api = API.prototype = new Parent(); -  behavior = Behavior.prototype = new API(); -  instance = new Behavior(); +  var evalLists = {sorted:[]}; +  var postList = [], postHash = {}, postId = 0; +  var servicesCache = extend({}, existing); +  var api = API.prototype = new Parent(); +  var behavior = Behavior.prototype = new API(); +  var instance = new Behavior();    extend(api, {      'this': instance, @@ -130,14 +131,23 @@ function createScope(parent, services, existing) {      $eval: function $eval(exp) {        var type = typeof exp; +      var i, iSize; +      var j, jSize; +      var queue; +      var fn;        if (type == $undefined) { -        for ( var i = 0, iSize = evalLists.sorted.length; i < iSize; i++) { -          for ( var queue = evalLists.sorted[i], +        for ( i = 0, iSize = evalLists.sorted.length; i < iSize; i++) { +          for ( queue = evalLists.sorted[i],                jSize = queue.length,                j= 0; j < jSize; j++) {              instance.$tryEval(queue[j].fn, queue[j].handler);            }          } +        while(postList.length) { +          fn = postList.shift(); +          delete postHash[fn.$postEvalId]; +          instance.$tryEval(fn); +        }        } else if (type === $function) {          return exp.call(instance);        } else  if (type === 'string') { @@ -202,6 +212,20 @@ function createScope(parent, services, existing) {        });      }, +    $postEval: function(expr) { +      if (expr) { +        var fn = expressionCompile(expr); +        var id = fn.$postEvalId; +        if (!id) { +          id = '$' + instance.$id + "_" + (postId++); +          fn.$postEvalId = id; +        } +        if (!postHash[id]) { +          postList.push(postHash[id] = fn); +        } +      } +    }, +      $become: function(Class) {        // remove existing        foreach(behavior, function(value, key){ delete behavior[key]; }); diff --git a/src/directives.js b/src/directives.js index 994ef90e..69648e31 100644 --- a/src/directives.js +++ b/src/directives.js @@ -115,6 +115,7 @@ var REMOVE_ATTRIBUTES = {  angularDirective("ng:bind-attr", function(expression){    return function(element){      var lastValue = {}; +    var updateFn = element.parent().data('$update');      this.$onEval(function(){        var values = this.$eval(expression);        for(var key in values) { @@ -132,6 +133,7 @@ angularDirective("ng:bind-attr", function(expression){            } else {              element.attr(key, value);            } +          this.$postEval(updateFn);          }        }      }, element); diff --git a/src/widgets.js b/src/widgets.js index b70c4dcb..fbca8436 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -209,7 +209,11 @@ function inputWidget(events, modelAccessor, viewAccessor, initFn) {            event.preventDefault();        });      } -    view.set(lastValue = model.get()); +    function updateView(){ +      view.set(lastValue = model.get()); +    } +    updateView(); +    element.data('$update', updateView);      scope.$watch(model.get, function(value){        if (lastValue !== value) {          view.set(lastValue = value); @@ -231,6 +235,14 @@ angularWidget('select', function(element){    return inputWidgetSelector.call(this, element);  }); +angularWidget('option', function(){ +  this.descend(true); +  this.directives(true); +  return function(element) { +    this.$postEval(element.parent().data('$update')); +  }; +}); +  angularWidget('ng:include', function(element){    var compiler = this, | 
