我是新的角度,并试图理解高级指令API -我想重新创建指令模板在编译函数使用指令元素属性。但是,当我没有模板集(或者模板是空字符串)而不是访问孤立的指令范围时,我就访问父(控制器)作用域。这也适用于角1.1,而不是1.2。
下面是HTML:
<div class="container" ng-app="app" ng-controller="AppController">
<sandbox title="Attribute Title"></sandbox>
</div>JavaScript:
var app = angular.module('app', [], function () {});
app.controller('AppController', function ($scope) {
$scope.title = "AppController title";
});
app.directive('sandbox', function ($log, $compile) {
return {
restrict: 'E',
scope: {
title: "@"
},
controller: function ($scope, $element, $attrs) {
$scope.title = "Directive Controller title";
},
template: '<h1>Template</h1>', // change it to: '' and Run, than change Angular to 1.2.x
compile: function (tElement, tAttrs) {
tElement.append('<h2> Title = {{ title }}</h2>');
}
}
});当你运行它时,你会得到:
模板
Title =属性标题
但是,当您将模板更改为空字符串时,您将得到角1.2:
Title = AppController Title
角为1.1.1:
Title =属性标题
我的问题:
为什么在设置模板时访问范围与未设置模板时存在差异?
为什么角1.1和1.2之间有区别(错误?-没有模板的指令,以及被隔离的作用域,控制器范围,而不是指令范围) ?
如何在编译函数中构建访问独立作用域而不是父作用域的模板?
为什么指令控制器函数不使用$scope.title =“.”更改'title‘,但是当调试'link’函数中的' scope‘param’标题‘值’时,它在内部(查找它的位置)绑定孤立的作用域‘属性值’?
下面是要玩的JSFiddle:http://jsfiddle.net/yoorek/zQ66L/4/
发布于 2014-01-05 17:01:01
您已经发现了在1.2中发生的一个重大变化(以及使用“@”的一个怪癖)。
1)当您的模板是时,没有看到要将隔离作用域应用到的模板。这是1.2中的一个问题的原因在于你的第二个问题的答案。
2) --这是这1.2个变化的结果-- 使隔离范围真正隔离:
隔离作用域现在只对请求它的隔离指令及其模板可用。
因此,如果没有模板,就会将其附加到隔离作用域之外的元素。
来自https://github.com/angular/angular.js/issues/4889
由于我们无法区分最初在html文件中的标记和在编译函数中添加的标记,后者也没有获得隔离作用域。
和
应使用模板属性替换编译函数中的...additional标记。 这个想法是模板属性也可以是一个函数。如果它是一个,它将获得编译元素和编译属性作为参数。
3)正如您在上面看到的,(POT1.2)实际上是在推动您在这里使用模板而不是编译函数。您最好的选择是以使用编译的方式使用模板函数。或者,您可以在$compile中使用链接函数,但这可能会增加不必要的复杂性。
通过在编译函数中添加内容,您可以有效地添加到模板中,这样就可以避免这种情况了。
4)这与@的工作方式有关。来自安古拉斯范围指南
使用链接函数中的attr_name(‘attr_name’)函数{.}来获得使用'@‘表示法的隔离作用域属性的内插值。例如,如果我们在链接函数中有-- attrs.$观察者(‘插值’,函数(值){.}-值将设置为11。(scope.interpolatedProp在链接函数中未定义)。相反,scope.twowayBindingProp是在链接函数中定义的,因为它使用'=‘表示法。
你也可以读到这个因此,在@和=之间的差异上发帖
https://stackoverflow.com/questions/20933591
复制相似问题