隔离作用域不能访问作用域链中较高的变量
Isolated scope cannot access variables higher in the scope chain
在有人把这个标记为重复之前,我在SO上发现了类似的问题:
- 隔离作用域变量未定义
- 无法在指令范围 中访问rootscope var
但我的问题本身就是一个不同的问题。
我有一个单独作用域的指令。在其post链接函数中,我试图访问一个恰好在根(最顶层)范围内的变量。在我孤立的范围内,我尝试了myVar: '@'
和myVar: '='
,但它们都没有工作,myVar是指令范围内的undefined
。下面是我的指令的返回语句:
{
restrict: 'E',
replace: true,
transclude: true,
template: tmpl,
scope: {
myVar: '@'
},
link: {
post: function ($scope) {
// $scope.myVar is undefined
// $scope.$root.myVar is defined
}
}
}
在我的控制台中,我记录了当前作用域对象,我可以跟踪$parent
一直到根,并看到var在那里,因此var也可以通过当前作用域的$root
访问。
我的问题是为什么'@'
和'='
在这种情况下不起作用?是因为var定义在链的更上层,而不是直接父变量,还是因为中间的父变量作用域本身就是一个孤立的作用域,破坏了对该变量的引用链?
如果你有一个孤立的作用域,你会想要传递给你的指令,无论它是你想要它用于my-val
。作为一个简单的例子,假设我们在html:
<my-test my-var='{{test}}'></my-test>
我们的主控制器将有一个名为test
的作用域变量。
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.test = 'World';
});
所以,如果你注意到指令设置了my-var
= {{test}}
。
现在我们的指令myVar
的作用域变量将被绑定到这个值。
app.directive('myTest', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<span>{{myVar}}</span>',
scope: {
myVar: '@'
},
link: {
post: function (scope) {
console.log(scope.myVar);
}
}
}
});
下面是一个简单的示例:http://plnkr.co/edit/rkbLJ0dJk4OrtyOD3c8w?p=preview
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量