为什么我的 angular 指令没有在隔离范围内获取父控制器范围?
Why is my angular directive not getting Parent controller scope inside isolated scope?
我已经严格按照 Angular 文档来获得一个指令,该指令可以处理一个独立的范围,其中包含来自父控制器范围对象的几个变量。
app.controller('MainCtrl', function($scope) {
$scope.name = 'Parent Name';
$scope.pokie = {
whyIs: "thisUndefined?"
};
});
app.directive('parseObject', function() {
var preLink = function($scope, el, att, controller) {
console.log('[link] :: ', $scope);
};
var postLink = function($scope, el, att, controller) {
console.log('[PostLink] :: ', $scope);
console.log('[$Parent] :: ', $scope.$parent.name);
};
return {
restrict: 'E',
scope: {
myPokie: '=pokie',
name: '=name'
},
template: [
'<div>',
'<h1>Directive does not get parent scope</h1>',
'<h1>{{ myPokie }}</h1>',
'<h2>{{ name }}</h2>',
'</div>'
].join(''),
compile: function() {
return {
pre: preLink,
post: postLink
}
}
}
});
http://plnkr.co/edit/FpQtt9?p=preview
谁能告诉我我的代码有什么问题?为什么指令的隔离范围 return 未定义 'myPokie' 和 'name' 的值?
我看到其他人说你必须为此使用 $scope.watch.. 但 angular 的指令文档对此没有任何说明.. 我真的不知道不想将 $scope.watch 用于一些应该开箱即用的微不足道的东西。
当您在指令中声明独立作用域时,这意味着您将使用属性向指令提供这些值。
scope: {
myPokie: '=pokie',
name: '=name'
}
这意味着您的指令作用域不会从父作用域原型继承。 pokie
属性为 myPokie
提供值 & name
属性将为您的指令提供 name
的值,=
表示双向绑定,如果您的 myPokie
指令中的值改变,相同的引用值将在父控制器中改变。 name
属性也是如此。
您的指令元素标记应为:
<parse-object pokie="pokie" name="name"></parse-object>
您使用的是独立作用域,但没有传递变量。问题出在你的 HTML:
将您的 HTML 更改为:
<parse-object></parse-object>
收件人:
<parse-object pokie="pokie" name="name"></parse-object>
独立范围从 DOM 元素获取参数。因此,如果您在范围内声明:
myPokie: '=pokie',
这意味着 myPokie
变量应该取自范围内的 pokie
属性。您的 name: "=name"
可以更改为 name: "="
,因为它是完全相同的名称。
我已经严格按照 Angular 文档来获得一个指令,该指令可以处理一个独立的范围,其中包含来自父控制器范围对象的几个变量。
app.controller('MainCtrl', function($scope) {
$scope.name = 'Parent Name';
$scope.pokie = {
whyIs: "thisUndefined?"
};
});
app.directive('parseObject', function() {
var preLink = function($scope, el, att, controller) {
console.log('[link] :: ', $scope);
};
var postLink = function($scope, el, att, controller) {
console.log('[PostLink] :: ', $scope);
console.log('[$Parent] :: ', $scope.$parent.name);
};
return {
restrict: 'E',
scope: {
myPokie: '=pokie',
name: '=name'
},
template: [
'<div>',
'<h1>Directive does not get parent scope</h1>',
'<h1>{{ myPokie }}</h1>',
'<h2>{{ name }}</h2>',
'</div>'
].join(''),
compile: function() {
return {
pre: preLink,
post: postLink
}
}
}
});
http://plnkr.co/edit/FpQtt9?p=preview
谁能告诉我我的代码有什么问题?为什么指令的隔离范围 return 未定义 'myPokie' 和 'name' 的值?
我看到其他人说你必须为此使用 $scope.watch.. 但 angular 的指令文档对此没有任何说明.. 我真的不知道不想将 $scope.watch 用于一些应该开箱即用的微不足道的东西。
当您在指令中声明独立作用域时,这意味着您将使用属性向指令提供这些值。
scope: {
myPokie: '=pokie',
name: '=name'
}
这意味着您的指令作用域不会从父作用域原型继承。 pokie
属性为 myPokie
提供值 & name
属性将为您的指令提供 name
的值,=
表示双向绑定,如果您的 myPokie
指令中的值改变,相同的引用值将在父控制器中改变。 name
属性也是如此。
您的指令元素标记应为:
<parse-object pokie="pokie" name="name"></parse-object>
您使用的是独立作用域,但没有传递变量。问题出在你的 HTML:
将您的 HTML 更改为:
<parse-object></parse-object>
收件人:
<parse-object pokie="pokie" name="name"></parse-object>
独立范围从 DOM 元素获取参数。因此,如果您在范围内声明:
myPokie: '=pokie',
这意味着 myPokie
变量应该取自范围内的 pokie
属性。您的 name: "=name"
可以更改为 name: "="
,因为它是完全相同的名称。