Angularjs 使用';控制器组件';将对象值传递给父控制器的语法

Angularjs 使用';控制器组件';将对象值传递给父控制器的语法,angularjs,angularjs-scope,Angularjs,Angularjs Scope,使用$scope控制器语法时,在父控制器的对象上设置值很简单。比如说 <div ng-controller="ParentController"> {{myValue.a}} <div ng-controller="ChildController"> {{myValue.a}} </div> </div> 上述产出: 2 2 有没有一种方法可以在不引用子控制器中的$scope的情况下使用控制器实现与语法相

使用
$scope
控制器语法时,在父控制器的对象上设置值很简单。比如说

<div ng-controller="ParentController">
    {{myValue.a}}
    <div ng-controller="ChildController">
        {{myValue.a}}
    </div>
</div>
上述产出:

2
2

有没有一种方法可以在不引用子控制器中的
$scope
的情况下使用
控制器实现与
语法相同的功能?

如果您不想使用
$scope
您可以将外部控制器传递到下游,请参见不,从
子控制器中不可能

不要认为ControllerAs是一种较新的
$scope
样式。每个都有不同的用途

ControllerAs
不会将值发布到作用域上(实际上是通过别名发布的,但不应假定子控制器知道别名,因为别名是在视图中定义的)

我在需要时使用这两种方法,并使用以下约定:

app.controller("ParentCtrl", function($scope){
   // $scope-inherited view model
   var VM = $scope.VM = ($scope.VM || {});

   // controller-specific view model
   var vm = this;

   VM.valueVisibleToChildControllers = "foo";
   vm.valueVisibleOnlyToTheView = "bar";
});

您可以使用服务来完成,也可以引用范围来完成

您正在使用的行为,范围继承,通常被称为不必要的副作用。这就是为什么隔离作用域与
controllerAs
语法一起使用的原因

在下面的示例中,您可以看到我们通过共享$scope上的myValue属性以及
controllerAs
语法实现了相同的结果

angular.module('app',[])
.controller('ParentController',ParentController)
.controller(“ChildController”,ChildController);
ParentController.$inject=['$scope'];
函数ParentController($scope){
this.myValue={};
这个.myValue.a=1;
$scope.myValue=this.myValue;
}
ChildController.$inject=['$scope'];
函数ChildController($scope){
this.myValue=$scope.myValue;
这个.myValue.a=2;
}

父项:{{parent.myValue.a}
子项:{{child.myValue.a}

我读到有人说“使用
$scope
语法或
ControllerAs
,不要混用”,但你的方法很有道理。无论如何,你的问题的答案是,除非你使用
$scope
,否则你不能从你的控制器访问scope变量。您可以使用
ng init=“childProp=p.parentProp”
,但这是一种不成熟的做法,所以我不推荐使用它。(Angular documentation也不建议使用
ng init
进行此操作)
app.controller("ParentCtrl", function($scope){
   // $scope-inherited view model
   var VM = $scope.VM = ($scope.VM || {});

   // controller-specific view model
   var vm = this;

   VM.valueVisibleToChildControllers = "foo";
   vm.valueVisibleOnlyToTheView = "bar";
});