add onload attribute to ng:include

This commit is contained in:
Igor Minar 2010-11-16 11:31:41 -08:00
parent cc749760fd
commit a130bb899d
2 changed files with 19 additions and 2 deletions

View file

@ -494,6 +494,7 @@ angularWidget('option', function(){
* *
* @param {string} src expression evaluating to URL. * @param {string} src expression evaluating to URL.
* @param {Scope=} [scope=new_child_scope] expression evaluating to angular.scope * @param {Scope=} [scope=new_child_scope] expression evaluating to angular.scope
* @param {string=} onload Expression to evaluate when a new partial is loaded.
* *
* @example * @example
* <select name="url"> * <select name="url">
@ -521,7 +522,8 @@ angularWidget('option', function(){
angularWidget('ng:include', function(element){ angularWidget('ng:include', function(element){
var compiler = this, var compiler = this,
srcExp = element.attr("src"), srcExp = element.attr("src"),
scopeExp = element.attr("scope") || ''; scopeExp = element.attr("scope") || '',
onloadExp = element[0].getAttribute('onload') || ''; //workaround for jquery bug #7537
if (element[0]['ng:compiled']) { if (element[0]['ng:compiled']) {
this.descend(true); this.descend(true);
this.directives(true); this.directives(true);
@ -546,13 +548,15 @@ angularWidget('ng:include', function(element){
}); });
this.$watch(function(){return changeCounter;}, function(){ this.$watch(function(){return changeCounter;}, function(){
var src = this.$eval(srcExp), var src = this.$eval(srcExp),
useScope = this.$eval(scopeExp); useScope = this.$eval(scopeExp);
if (src) { if (src) {
xhr('GET', src, function(code, response){ xhr('GET', src, function(code, response){
element.html(response); element.html(response);
childScope = useScope || createScope(scope); childScope = useScope || createScope(scope);
compiler.compile(element)(element, childScope); compiler.compile(element)(element, childScope);
childScope.$init(); childScope.$init();
scope.$eval(onloadExp);
}); });
} else { } else {
childScope = null; childScope = null;

View file

@ -532,6 +532,19 @@ describe("widget", function(){
// we need to have real events on the scopes. // we need to have real events on the scopes.
expect(element.text()).toEqual('4'); expect(element.text()).toEqual('4');
}); });
it('should evaluate onload expression when a partial is loaded', function() {
var element = jqLite('<ng:include src="url" onload="loaded = true"></ng:include>');
var scope = angular.compile(element);
expect(scope.loaded).not.toBeDefined();
scope.url = 'myUrl';
scope.$inject('$xhr.cache').data.myUrl = {value:'my partial'};
scope.$init();
expect(element.text()).toEqual('my partial');
expect(scope.loaded).toBe(true);
});
}); });
describe('a', function() { describe('a', function() {