Javascript 使用标准方法访问父范围值

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的作用域,但是当我使用
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