Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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 将父指令变量与子指令进行角度通信_Javascript_Html_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 将父指令变量与子指令进行角度通信

Javascript 将父指令变量与子指令进行角度通信,javascript,html,angularjs,angularjs-directive,Javascript,Html,Angularjs,Angularjs Directive,我正试图基于转换到div中的元素构建一个简单的show/hide指令。我有一个家长和一个孩子的指令。单击父指令时,子指令应切换显示/隐藏其div。切换函数位于父控制器中,并在true和false之间切换变量,以便子指令可以显示/隐藏 问题是:父指令中的toggle函数工作正常,但是子指令在单击父指令时不知道toggle变量发生了变化。我使用require将ctrl传递给child指令中的link函数。通过这种方式,我可以访问父控制器对象以进行显示和隐藏。toggle变量对子项可见,但不反映初始加

我正试图基于转换到div中的元素构建一个简单的show/hide指令。我有一个家长和一个孩子的指令。单击父指令时,子指令应切换显示/隐藏其div。切换函数位于父控制器中,并在true和false之间切换变量,以便子指令可以显示/隐藏

问题是:父指令中的toggle函数工作正常,但是子指令在单击父指令时不知道toggle变量发生了变化。我使用require将ctrl传递给child指令中的link函数。通过这种方式,我可以访问父控制器对象以进行显示和隐藏。toggle变量对子项可见,但不反映初始加载页面后的任何更改。单击时,不会显示或隐藏任何内容

代码:

angular.module('demo',[])
.directive('demoParent',function(){
返回{
限制:'E',
作用域:{},
是的,
模板:“”,
控制器:功能($scope){
$scope.toggleTarget=函数(){
this.openTarget=!this.openTarget;
};
this.openTarget=false;
}
};
})
.directive('demoChild',function(){
返回{
要求:“^demoParent”,
限制:'E',
是的,
链接:函数(范围、元素、属性、ctrl){
scope.ctrl=ctrl;
},
模板:“”,
};
});
子项是否需要向父项ctrl添加观察者,或者这是一种从父项传递到子项的孤立变量的情况

试试这个: var me=这个; $scope.toggleTarget=函数(){ me.openTarget=!me.openTarget; };

我已经对您的工作场景进行了修改,您对
这个
功能也有问题,除了
^demoChild
,您说这是一个打字错误。进入函数后,
指向的是作用域,而不是您预期的控制器,因此应修改本节:

controller: function($scope) {
    this.openTarget = false;
    var _ctrl = this;
    $scope.toggleTarget = function() {
        _ctrl.openTarget = !_ctrl.openTarget;              
    };              
}

demoChild
需要demoChild控制器。如果您需要从
demoChild
访问
demoParent
的范围,则需要使用
require:'^demoParent'
来要求它。您也可以显示您的HTML吗?只是将其更改为demoParent,这是我的输入错误。我没有得到任何错误的要求,家长控制器。看来孩子只是没有意识到为我工作的家长控制器有任何变化。为什么把它分配给另一个var可以解决这个问题?直接使用vs并将其传递给子级。@user3613538
var\u ctrl=this需要此行来保持对控制器的引用,然后在函数中使用控制器。否则,
指向
$scope
本身,因为
的值会有所不同-具体取决于调用函数的方式。
controller: function($scope) {
    this.openTarget = false;
    var _ctrl = this;
    $scope.toggleTarget = function() {
        _ctrl.openTarget = !_ctrl.openTarget;              
    };              
}