added ng-eval-order attribute

This commit is contained in:
Misko Hevery 2010-04-12 16:24:28 -07:00
parent 841640e540
commit 713307b650
7 changed files with 53 additions and 13 deletions

4
angular-debug.js vendored
View file

@ -2788,9 +2788,9 @@ foreach({
});
}
if (state === null){
if (state === null && this['$invalidWidgets']){
// request in flight, mark widget invalid, but don't show it to user
(this['$invalidWidgets']||[]).push(this.$element);
this['$invalidWidgets'].markInvalid(this.$element);
}
return state;
}

View file

@ -9,6 +9,7 @@ var consoleNode,
PRIORITY_FIRST = -99999,
PRIORITY_WATCH = -1000,
PRIORITY_LAST = 99999,
PRIORITY = {'FIRST': PRIORITY_FIRST, 'LAST': PRIORITY_LAST, 'WATCH':PRIORITY_WATCH},
NOOP = 'noop',
NG_EXCEPTION = 'ng-exception',
NG_VALIDATION_ERROR = 'ng-validation-error',

View file

@ -4,17 +4,34 @@
* bind to a new instance of elements. It also provides a list
* of child paths which contain child templates
*/
function Template() {
function Template(priority) {
this.paths = [];
this.children = [];
this.inits = [];
this.priority = priority || 0;
}
Template.prototype = {
init: function(element, scope) {
var inits = {};
this.collectInits(element, inits);
foreachSorted(inits, function(queue){
foreach(queue, function(fn){
fn(scope);
});
});
},
collectInits: function(element, inits) {
var queue = inits[this.priority];
if (!queue) {
inits[this.priority] = queue = [];
}
element = jqLite(element);
foreach(this.inits, function(fn) {
scope.$tryEval(fn, element, element);
queue.push(function(scope) {
scope.$tryEval(fn, element, element);
});
});
var i,
@ -23,7 +40,7 @@ Template.prototype = {
paths = this.paths,
length = paths.length;
for (i = 0; i < length; i++) {
children[i].init(childNodes[paths[i]], scope);
children[i].collectInits(childNodes[paths[i]], inits);
}
},
@ -78,13 +95,13 @@ Compiler.prototype = {
};
},
templatize: function(element){
templatize: function(element, priority){
var self = this,
widget,
directiveFns = self.directives,
descend = true,
directives = true,
template = new Template(),
template,
selfApi = {
compile: bind(self, self.compile),
comment:function(text) {return jqLite(document.createComment(text));},
@ -93,7 +110,11 @@ Compiler.prototype = {
descend: function(value){ if(isDefined(value)) descend = value; return descend;},
directives: function(value){ if(isDefined(value)) directives = value; return directives;}
};
priority = element.attr('ng-eval-order') || priority || 0;
if (isString(priority)) {
priority = PRIORITY[uppercase(priority)] || 0;
}
template = new Template(priority);
eachAttribute(element, function(value, name){
if (!widget) {
if (widget = self.widgets['@' + name]) {
@ -135,7 +156,7 @@ Compiler.prototype = {
// Process non text child nodes
if (descend) {
eachNode(element, function(child, i){
template.addChild(i, self.templatize(child));
template.addChild(i, self.templatize(child, priority));
});
}
return template.empty() ? null : template;

View file

@ -252,5 +252,5 @@ ApiTest.prototype.testStringFromUTC = function(){
};
ApiTest.prototype.testObjectShouldHaveExtend = function(){
assertEquals(angular.Object.extend, extend);
assertEquals({a:1, b:2}, angular.Object.extend({a:1}, {b:2}));
};

View file

@ -72,7 +72,7 @@ describe('compiler', function(){
var scope = compile('<span hello="misko" stop="true"><span hello="adam"/></span>');
expect(log).toEqual("hello misko");
});
it('should allow creation of templates', function(){
directives.duplicate = function(expr, element){
element.replaceWith(document.createComment("marker"));

View file

@ -88,11 +88,15 @@ describe('Validator:asynchronous', function(){
var value, fn;
beforeEach(function(){
var invalidWidgets = [];
invalidWidgets.markInvalid = function(element){
invalidWidgets.push(element);
};
value = null;
fn = null;
self = {
$element:jqLite('<input />'),
$invalidWidgets:[],
$invalidWidgets:invalidWidgets,
$updateView: noop
};
});
@ -125,7 +129,7 @@ describe('Validator:asynchronous', function(){
it("should not make second request to same value", function(){
asynchronous.call(self, "kai", function(v,f){value=v; fn=f;});
expect(value).toEqual('kai');
expect(self.$invalidWidgets).toEqual([self.$element]);
expect(self.$invalidWidgets[0][0]).toEqual(self.$element[0]);
var spy = jasmine.createSpy();
asynchronous.call(self, "kai", spy);

View file

@ -181,4 +181,18 @@ describe("directives", function(){
expect(scope.greet('misko')).toEqual('hello misko!');
delete window.Greeter;
});
it('should eval things according to ng-eval-order', function(){
var scope = compile(
'<div ng-init="log=\'\'">' +
'{{log = log + \'e\'}}' +
'<span ng-eval-order="first" ng-eval="log = log + \'a\'">' +
'{{log = log + \'b\'}}' +
'<span src="{{log = log + \'c\'}}"></span>' +
'<span bind-template="{{log = log + \'d\'}}"></span>' +
'</span>' +
'</div>');
expect(scope.log).toEqual('abcde');
});
});