Javascript 使用标准方法访问父范围值
今天我想知道安格拉斯的一些奇怪行为。我使用console.log来记录$scope,没有键附加到名为val1的作用域,但是当我使用Javascript 使用标准方法访问父范围值,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,今天我想知道安格拉斯的一些奇怪行为。我使用console.log来记录$scope,没有键附加到名为val1的作用域,但是当我使用console.log($scope.val1)它作为对象返回的值时。在找出原因后,我发现它正在访问父作用域,因为$scope中没有名为val1的kay。现在我的问题是, 哪一个是好的实践?你能证明一下吗 使用$scope.$parent.val1 使用$scope.val1 您通常不应该使用$scope.$parent,而应该依赖Javascripts原型继承。通过
console.log($scope.val1)
它作为对象返回的值时。在找出原因后,我发现它正在访问父作用域,因为$scope中没有名为val1的kay。现在我的问题是,
哪一个是好的实践?你能证明一下吗
$scope.$parent.val1
$scope.val1
您通常不应该使用
$scope.$parent
,而应该依赖Javascripts原型继承。通过直接访问父级,如果将指令/控制器在作用域层次结构中上移一步,并且数据现在位于$scope.$parent.$parent
上,则会有代码中断的风险
相反,不要直接写入作用域上的属性,而是写入作用域对象上的对象
假设你这样做:
$scope.$parent.value = 'x';
然后你会:
console.log($scope.value);
这将在控制台上打印x
。如果你这样做:
$scope.value = 'y';
您没有修改父作用域上的值
属性,而是在子作用域上引入一个新属性。因此,$scope.$parent.value
仍将包含x
要解决这个问题,您需要:
$scope.$parent.data = {value: 'x'};
console.log($scope.data.value); // prints x
$scope.data.value = 'y';
console.log($scope.data.value); // prints y
console.log($scope.$parent.data.value); // also prints y
这种方法之所以有效,是因为它不需要在子作用域上创建新的
值
属性,而是首先需要查找数据
属性。这不在子范围内,因此它会沿着原型链($parent)查找数据对象。数据
对象位于父对象上,而值
属性则设置在该对象上。它取决于val1
的类型,如果它是原语,则必须通过$scope.$parent显式访问它。
如果它是一个对象,您可以利用Angular中父范围和子范围之间存在的原型继承,并定期引用它,正如我确信您知道的,对象是通过引用传递的,因此对对象的任何更改都会在父范围上更改它
提供一个简单的示例演示。最好在真实代码的上下文中回答这个问题。简而言之,一切都从$rootScope
开始,所有作用域都在$rootScope
中的一个树中。最好不要使用作用域继承。这可能是造成误解的原因。如果需要在控制器之间共享一些值,最好使用服务@valverde93,这是一个过于宽泛的声明。如果ng repeat
自动使用继承,因为每次重复都会创建一个子作用域,那么如何?@valverde93,如果在具有ng controller的元素中使用任何自定义指令,那么该指令元素将有两个作用域,一个是of directive,另一个是控制器,它是该指令的父作用域。@LaxmikantDange对于您确切的问题,最好的答案是。。。忘记编写代码时,$parent
属性甚至存在。但是,不要忘记非隔离子作用域确实从parents继承,但这是一种好的做法?通过使用$parent链直接访问该属性或直接使用$scope.val1?@LaxmikantDange读取答案中的第一句话……永远不要在代码中使用$parent
,否则,你做的事情就不对,而且几乎总是有一种方法可以设置事情不需要使用$scope来完成。答案中的$parent
只是一个例子,可以让我明白我的观点。除非你有很好的理由,否则你不应该访问$parent
。