mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
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:
parent
418d7a36ff
commit
e0c134b8bf
2 changed files with 18 additions and 4 deletions
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue