为什么在 link 中改变父指令范围的值不会将该变异状态提供给子指令?
Why does mutating a value of a parent directive's scope in link not provide that mutated state to a child directive?
我有一个父指令被传递一个数组作为它的一个属性的值。父指令的工作是渲染一些组件,然后将该数组的修改版本发送给子指令。然后子指令需要呈现修改后的数组。
在父指令的 link 函数中调整此数组似乎不会将更改传播到呈现的子指令。
这是为什么?
我才进入 AngularJS 几天,可能对范围或生命周期有根本性的误解,但我不确定是哪一个。
下面的示例通过让父指令将 3 压入其中来修改提供给父指令的 [1,2] 数组。
父指令呈现一个模板,其中包含子指令以及我希望的变异数组。
屏幕将呈现未变异的数组(从子指令呈现),但 console.log 变异的数组(从父指令记录)
https://codesandbox.io/s/trusting-fire-k4so0?fontsize=14&hidenavigation=1&theme=dark
src/index.js
"use_strict";
var angular = require("angular");
angular
.module("App", [])
.controller("IgnorableController", [function(){}])
.directive("parentIsolatedScope", [
function() {
return {
restrict: "E",
template:
"<child-isolated-scope mutated-array='mutableArray'></child-isolated-scope>",
scope: {
mutableArray: "<"
},
link: function(scope) {
scope.mutableArray.push(3);
console.log(scope.mutableArray);
}
};
}
])
.directive("childIsolatedScope", [
function() {
return {
restrict: "E",
template: "<div>{{mutatedArray | json}}</div>",
scope: {
mutatedArray: "<"
}
};
}
]);
index.html
<!DOCTYPE html>
<html ng-app="App">
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<script src="src/index.js"></script>
</head>
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="[1,2]"></parent-isolated-scope>
</body>
</html>
如果您为初始数组声明一个变量并使用它将数组传递给指令,它将按预期工作:
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="initialArray"></parent-isolated-scope>
</body>
在IgnorableController中,数组变量:
$scope.initialArray= [1, 2];
工作演示:DEMO
如果您为初始数组声明一个变量并使用它将数组传递给指令,它将按预期工作。
Can you provide an explanation as to why that's the case?
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="[1,2]"></parent-isolated-scope>
</body>
当绑定是解析为数组的 AngularJS 表达式时,在每个摘要循环中,框架都会计算表达式并将隔离范围变量设置为该值。在每个摘要周期中,框架都会重新设置值以替换任何突变。
有一个变量:
<body ng-controller="IgnorableController" ng-init="x = [1,2]">
<parent-isolated-scope mutable-array="x"></parent-isolated-scope>
</body>
对变量的引用已分配给隔离作用域。
请注意,对引用内容的任何更改都会更改子隔离作用域和父作用域中的内容。这可能会对某些设计产生意想不到的后果。
我有一个父指令被传递一个数组作为它的一个属性的值。父指令的工作是渲染一些组件,然后将该数组的修改版本发送给子指令。然后子指令需要呈现修改后的数组。
在父指令的 link 函数中调整此数组似乎不会将更改传播到呈现的子指令。
这是为什么?
我才进入 AngularJS 几天,可能对范围或生命周期有根本性的误解,但我不确定是哪一个。
下面的示例通过让父指令将 3 压入其中来修改提供给父指令的 [1,2] 数组。
父指令呈现一个模板,其中包含子指令以及我希望的变异数组。
屏幕将呈现未变异的数组(从子指令呈现),但 console.log 变异的数组(从父指令记录)
https://codesandbox.io/s/trusting-fire-k4so0?fontsize=14&hidenavigation=1&theme=dark
src/index.js
"use_strict";
var angular = require("angular");
angular
.module("App", [])
.controller("IgnorableController", [function(){}])
.directive("parentIsolatedScope", [
function() {
return {
restrict: "E",
template:
"<child-isolated-scope mutated-array='mutableArray'></child-isolated-scope>",
scope: {
mutableArray: "<"
},
link: function(scope) {
scope.mutableArray.push(3);
console.log(scope.mutableArray);
}
};
}
])
.directive("childIsolatedScope", [
function() {
return {
restrict: "E",
template: "<div>{{mutatedArray | json}}</div>",
scope: {
mutatedArray: "<"
}
};
}
]);
index.html
<!DOCTYPE html>
<html ng-app="App">
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<script src="src/index.js"></script>
</head>
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="[1,2]"></parent-isolated-scope>
</body>
</html>
如果您为初始数组声明一个变量并使用它将数组传递给指令,它将按预期工作:
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="initialArray"></parent-isolated-scope>
</body>
在IgnorableController中,数组变量:
$scope.initialArray= [1, 2];
工作演示:DEMO
如果您为初始数组声明一个变量并使用它将数组传递给指令,它将按预期工作。
Can you provide an explanation as to why that's the case?
<body ng-controller="IgnorableController">
<parent-isolated-scope mutable-array="[1,2]"></parent-isolated-scope>
</body>
当绑定是解析为数组的 AngularJS 表达式时,在每个摘要循环中,框架都会计算表达式并将隔离范围变量设置为该值。在每个摘要周期中,框架都会重新设置值以替换任何突变。
有一个变量:
<body ng-controller="IgnorableController" ng-init="x = [1,2]">
<parent-isolated-scope mutable-array="x"></parent-isolated-scope>
</body>
对变量的引用已分配给隔离作用域。
请注意,对引用内容的任何更改都会更改子隔离作用域和父作用域中的内容。这可能会对某些设计产生意想不到的后果。