2016-04-28 77 views
3

我是Angular世界的新手,我想知道是否使用$parent全局变量来访问父范围是一个好习惯。例如,data-ng-if会创建一个隔离的作用域,这会导致访问父作用域时遇到一些问题,所以唯一的方法是$parent.myVariable

任何例子,任何建议,以确保我的代码是干净的,遵循良好的做法将是可观的。

+0

'NG-if'不会创建一个分离范围;它创建了一个继承范围。 – georgeawg

回答

2

ng-if指令应该看到父范围,不管see demo

在有关指令的分离范围的情况下,最好的传球$scope对象向下通过一个接口,而不是指望物业工作中存在的$parent

app.controller("myCtrl", function($scope){ 
    $scope.foo = "bar"; 
}); 

app.directive("myDirective", function(){ 
    return { 
     scope: { 
      // expect foo to be passed to the directive 
      // = means conserve bi directional binding 
      foo: "=" 
     }, 
     link: function(scope) { 
      ... // scope.foo is defined 
     } 
    } 
}); 

在视图

<div ng-controller="myCtrl"> 
    <my-directive foo="foo"></my-directive> 
</div> 
1

最好的做法是让你的指令解耦,它应该是自包含的,如果指令需要外部方面,你可以注入它们或绑定它们。不适合依靠某些特定环境中使用的东西。

一个例子是:

<div ng-controller="Parent as parent"> 

    <div ng-if="parent.showMessage"> 
    Some simple message. 
    </div> 

    <div child-one parent="parent"></div> 

</div> 

控制器

app.controller('Parent', function() { 
    var self = this; 
    self.showMessage = true; 
}); 

app.directive('childOne', function() { 
    return { 
     controllerAs: 'childOne', 
     controller: function($scope, $attrs) { 
      var parent = $scope.$eval($attrs.parent); 

      var self = this; 
      self.foo = 'bar'; 
      // Some simple logic. 
      if (self.foo === 'bar') { 
       parent.showMessage = false; 
      } 
     } 
    }; 
}); 
1

似乎完全没这样做。

<div ng-app ng-controller="NameCtrl"> 
    <div ng-controller="ChildCtrl as vm"> 
     {{$parent.names}} 
    </div> 
</div> 

function NameCtrl($scope) { 
    $scope.names = ["Tom", "Dick", "Harry"]; 
} 

function ChildCtrl($scope) { 
    $scope.parentnames = $scope.$parent.names; 
} 

参见:http://jsfiddle.net/8bojdnpt/

从一个很好的做法来看,这种方法也不错,因为你也可以摧毁不需要的范围,使他们不留在缓冲区中。

但是,约翰帕帕建议不要使用$parenthttps://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#controllers。相反,他宁愿使用controller as语法。

3

这不是一个好习惯,它会给你带来麻烦。假设你有一个绑定到控制器的<div>和一个<div ng-if>,你决定在你的潜水中使用{{ $parent.myVariable }}。如果您需要嵌入另一个ng-if,会发生什么情况?或者删除唯一的ng-if

我建议你把变量保存在存储在控制器$scope变量中的对象中。
所以你应该在你的控制器中有这样的东西。

$scope.MyValues = {}; 
$scope.MyValues.myVariable = 5; 

现在你能避免使用$parent<div>内安全地寻找{{ MyValues.myVariable }}和角度将回落至$parent,直到它找到MyValues对象,这样你就可以(几乎)忘记ng-if范围的问题。这同样适用于嵌套控制器。

这里快速参考这些类型的最佳实践:learn-how-to-use-scopes-properly-in-angularjs

相关问题