Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.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 通过双向绑定跨2个控制器AngularJS触发事件_Javascript_Html_Angularjs_Binding_Angular Directive - Fatal编程技术网

Javascript 通过双向绑定跨2个控制器AngularJS触发事件

Javascript 通过双向绑定跨2个控制器AngularJS触发事件,javascript,html,angularjs,binding,angular-directive,Javascript,Html,Angularjs,Binding,Angular Directive,这是关于角度1的问题,不是角度2的问题 我的设置有点复杂:我有一个负责特定页面的控制器(控制器a)。在这个页面上,我有一个自定义指令,它接受从页面上的控制器提取的输入。然而,这个自定义指令也有自己的控制器(控制器B),我通过属性上的绑定将信息传递给它。我传入该指令和控制器B的大部分信息都是由控制器A生成并通过控制器A处理的 控制器A基本上可以描述为控制器B的父级 但是,与控制器B的该指令绑定是双向绑定(=),因此,由于双向绑定,并且由于传入的初始属性是控制器A的绑定信息,因此在该指令中控制器B中

这是关于角度1的问题,不是角度2的问题

我的设置有点复杂:我有一个负责特定页面的控制器(控制器a)。在这个页面上,我有一个自定义指令,它接受从页面上的控制器提取的输入。然而,这个自定义指令也有自己的控制器(控制器B),我通过属性上的绑定将信息传递给它。我传入该指令和控制器B的大部分信息都是由控制器A生成并通过控制器A处理的

控制器A基本上可以描述为控制器B的父级

但是,与控制器B的该指令绑定是双向绑定(
=
),因此,由于双向绑定,并且由于传入的初始属性是控制器A的绑定信息,因此在该指令中控制器B中更改的信息应该返回并进入控制器A

虽然很复杂,但这对我来说99%的时间都有效。我想用这种方式禁用页面上的一个按钮:
ng disabled=CtrlA.buttonDisabled()

buttonDisabled()
是控制器a上的一个函数,它从控制器B指令中的双向有界值中获取信息,以返回true、禁用按钮或false,不禁用按钮

在一个特定的实例中,即使在更改控制器B上的值(该值会影响该功能)时,该功能本身也不会启动,因此当应禁用“我的按钮”时,该按钮也会启用

我想知道如何强制控制器A上的
buttonDisabled()
执行控制器B内部的更改值。这可能吗?我可以通过$watch来完成吗?如果是,我应该将这些信息放在哪个控制器上

下面是我的代码的一个非常简化的版本:

控制器A:

$scope.userName = "";
$scope.buttonDisabled = function() {
    if($scope.userName){
        return false;
    }
    return true;
};
$scope.userName = "";
var buttonDisabled = function() {
    if($scope.userName){
        return false;
    }
    return true;
};
控制器B:

$scope.userName = "";
$scope.clearUserName = function(){
    $scope.userName = "";
    //I want to call disableButton from controller A here
}
$scope.userName = "";
$scope.clearUserName = function(){
    $scope.userName = "";
    $scope.out(); //calling the callback the directive was bound to, ultimately calling buttonDisabled() from Controller A
}
主页的HTML:

<div ng-controller="CtrlA">
    <specialDirective username="{{userName}}"></specialDirective>
    <button ng-disabled="buttonDisabled()" ></button>
</div>
<div ng-controller="CtrlA">
    <specialDirective username="{{userName}}" out="buttonDisabled()"></specialDirective>
    <button ng-disabled="buttonDisabled()"></button>
</div>
userName
在specialDirective中是双向绑定的

由于其他要求,我无法将
clearUserName()
buttonDisabled()
直接移动到其他控制器中


编辑:感谢那些指出我的缺点的评论者——我在这篇文章和我的回复中已经尽了最大的努力来纠正它们。我从头开始写这个例子,因为复制粘贴我的代码太复杂了,因为它不直接使用$scope对象,等等,所以我为我的语法错误道歉。如果我还遗漏了什么,请纠正我。(:

通过一些搜索,现在看到了Georgeawg的评论,我能够找到如何使用单向回调绑定实现我想要的功能


通过使用
在指令模板中使用
ng controller
指令是不明智的,因为
ng controller
添加了一个子作用域。Instread使用指令定义对象的
controller
属性。有关更多信息,请参阅。该代码混合了双花括号,
{}
,带角度表达式的插值。这是不明智的,会带来问题。有关更多信息,请参阅,最好避免双向,
=
,绑定。相反,输入应与
元素一起使用
,起始标记和结束标记都是必需的。有关更多信息,请参阅。
$scope.userName = "";
$scope.clearUserName = function(){
    $scope.userName = "";
    $scope.out(); //calling the callback the directive was bound to, ultimately calling buttonDisabled() from Controller A
}
<div ng-controller="CtrlA">
    <specialDirective username="{{userName}}" out="buttonDisabled()"></specialDirective>
    <button ng-disabled="buttonDisabled()"></button>
</div>
<input ng-model="userName" />
<button ng-click="clearUserName()"></button>
app.component("specialDirective",{
    controller: CtrlB,
    bindings: { 
        out: "<",
        userName: "="
    },
    template: "directiveTemplate.html"
});