fix($compile): work around issue in jQuery 1.10.2

jQuery 1.10.2 does not attach data to comment nodes, which previously broke `$compile`.
This changes how elements with "transclude element" and a controller are compiled to
avoid the issue.

Closes #3764
This commit is contained in:
Brian Ford 2013-09-25 12:30:51 -07:00
parent 418d7a36ff
commit e0c134b8bf
2 changed files with 18 additions and 4 deletions

View file

@ -1,7 +1,7 @@
{
"name": "AngularJS",
"devDependencies": {
"jquery": "git://github.com/components/jquery.git#v1.8.3",
"jquery": "1.10.2",
"lunr.js": "0.4.0",
"google-code-prettify": "1.0.0",
"components-font-awesome": "3.1.0",

View file

@ -925,7 +925,14 @@ function $CompileProvider($provide) {
}
optional = optional || value == '?';
}
value = $element[retrievalMethod]('$' + require + 'Controller');
if ($element[0].nodeType == 8 && $element[0].$$controller) { // Transclusion comment node
value = value || $element[0].$$controller;
$element[0].$$controller = null;
}
if (!value && !optional) {
throw $compileMinErr('ctreq', "Controller '{0}', required by directive '{1}', can't be found!", require, directiveName);
}
@ -1040,9 +1047,16 @@ function $CompileProvider($provide) {
}
controllerInstance = $controller(controller, locals);
$element.data(
'$' + directive.name + 'Controller',
controllerInstance);
// Directives with element transclusion and a controller need to attach controller
// to the comment node created by the compiler, but jQuery .data doesn't support
// attaching data to comment nodes so instead we set it directly on the element and
// remove it after we read it later.
if ($element[0].nodeType == 8) { // Transclusion comment node
$element[0].$$controller = controllerInstance;
} else {
$element.data('$' + directive.name + 'Controller', controllerInstance);
}
if (directive.controllerAs) {
locals.$scope[directive.controllerAs] = controllerInstance;
}