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