Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angular中使用$parent是一种好的做法吗?_Javascript_Angularjs_Coding Style - Fatal编程技术网

Javascript 在angular中使用$parent是一种好的做法吗?

Javascript 在angular中使用$parent是一种好的做法吗?,javascript,angularjs,coding-style,Javascript,Angularjs,Coding Style,我是Angular领域的新手,我想知道使用$parent全局变量访问父范围是否是一种好的做法。例如,数据ng if会创建一个孤立的作用域,这有时会导致访问父作用域时出现一些问题,因此唯一的方法是$parent.myVariable 任何示例,任何确保我的代码干净并遵循良好实践的建议都是值得注意的。如果ng if指令应该看到父范围,不管它是什么 在指令上隔离作用域的情况下,最好通过接口向下传递$scope对象,而不要指望$parent上存在属性: app.controller("myCtrl",

我是Angular领域的新手,我想知道使用
$parent
全局变量访问父范围是否是一种好的做法。例如,
数据ng if
会创建一个孤立的作用域,这有时会导致访问父作用域时出现一些问题,因此唯一的方法是
$parent.myVariable


任何示例,任何确保我的代码干净并遵循良好实践的建议都是值得注意的。

如果
ng if
指令应该看到父范围,不管它是什么

在指令上隔离作用域的情况下,最好通过接口向下传递
$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>

最佳实践是使您的指令解耦,它应该是自包含的,如果指令需要外部方面,您可以插入它们或绑定它们。依靠在特定环境中使用的东西是不好的

一个例子是:

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

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

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

</div>

这样做似乎完全可以

<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;
}

{{$parent.names}
函数名Ctrl($scope){
$scope.names=[“汤姆”、“迪克”、“哈利”];
}
函数ChildCtrl($scope){
$scope.parentnames=$scope.$parent.names;
}
见:

从良好实践的角度来看,这种方法也很好,因为您还可以销毁不需要的作用域,这样它们就不会保留在缓冲区中


然而,John Papa建议不要使用
$parent
:。相反,他希望您使用
控制器作为
语法。

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

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

$scope.MyValues = {};
$scope.MyValues.myVariable = 5;
现在,您可以避免在
中使用
$parent
并安全地查找
{{MyValues.myVariable}}
,angular将通过
$parent
返回,直到找到
MyValues
对象,因此,如果出现范围问题,您可以(几乎)忘记
ng。这同样适用于嵌套控制器


这里是对此类最佳实践的快速引用:

如果
没有创建隔离范围,则执行

ng;它创建一个继承的作用域。
$scope.MyValues = {};
$scope.MyValues.myVariable = 5;