Javascript 如何在AngularJS服务中观察或观察输入属性的更改?
我的UI中有一个单选按钮,它有一个ngModel,它通过ngDisabled启用/禁用另一个输入 当一个输入元素被启用/禁用并且必须在角度服务中完成时,我想观察/观察/触发。我简直找不到该怎么做。以下是我在指令中的做法:Javascript 如何在AngularJS服务中观察或观察输入属性的更改?,javascript,jquery,angularjs,angularjs-service,angular-services,Javascript,Jquery,Angularjs,Angularjs Service,Angular Services,我的UI中有一个单选按钮,它有一个ngModel,它通过ngDisabled启用/禁用另一个输入 当一个输入元素被启用/禁用并且必须在角度服务中完成时,我想观察/观察/触发。我简直找不到该怎么做。以下是我在指令中的做法: // for the case of field that might be ng-disabled, we should skip validation // Observe the angular disabled attribute attrs.$observe("dis
// for the case of field that might be ng-disabled, we should skip validation
// Observe the angular disabled attribute
attrs.$observe("disabled", function(disabled) {
if (disabled) {
// Turn off validation when element is disabled
cancelValidation();
} else {
// Re-Validate the input when enabled
var value = ctrl.$viewValue || '';
ctrl.$setValidity('validation', validate(value, true));
}
});
但是如何在服务中做到这一点呢???
我不希望有其他指令,我真的希望通过服务完成 在问这个问题之前,我找到了这个,并尝试了一下
scope.$watch(function() {return element.attr('disabled'); }, function(newValue){});
但这似乎不起作用,至少当我启用/禁用我的单选按钮(作为ngDisabled的输入元素绑定到带有ngModel的单选按钮时不起作用)
我还发现,我们可以使用jQuery.watch(),但我想继续使用vanilla javascript或jqLite。可能吗
编辑我应该提到,这个服务是独立的,不能访问控制器,因为它是一个表单验证工具,不了解外部(至少不超过元素本身及其范围)。您可以检查它并在需要时使用它:它支持指令和服务,具体取决于您希望验证发生的内容或位置,我的问题仅与服务中的代码有关。我的答案帮助我解决了这个问题。。。谢谢:)范围的目的是“粘合”应用程序的演示和业务逻辑。将
$scope
传递到服务中没有多大意义。
在使用此服务(与单选按钮视图相关联的服务)初始化控制器时,您始终可以执行$scope.$watch
,并触发对服务的调用以执行所需的更新
如果您已经可以在服务中访问此变量(从控制器获取),您应该能够执行以下操作:
app.service('myservice',function(){
this.listen = function($scope) {
$scope.$watch(function(){return someScopeValue},function(){
//$scope.dosomestuff();
});
}
});
//your controller
function myCtrl($scope,myservice) {
$scope.listen = function() {
myservice.listen($scope);
}
//call your method
$scope.listen();
}
我相信您已经禁用了属性
,并使用了类似disabled=“{{disable}}}”
的插值,这就是为什么您能够将$observe
放在该值上,尝试将相同的内容更改为$watch
不会对该属性起作用,您还需要$interpolate
服务来评估属性插值。因此,实际值将得到评估,如果它是禁用的
或'
,并且如果改变它的状态,那么$watch
函数将相应地被触发
代码
scope.$watch(function() {
return $interpolate(element.attr('disabled'))(scope); //this will evaluate attribute value `{{}}``
}, function(newValue){
//your code would be here
});
感谢您的回复,由于其他原因,我的服务中确实有一个范围
。但正如我所提到的,我无法让它在范围内工作。$watch
,我想观察属性的变化,而不是值的变化。。。那我该怎么做呢?如果您能发送一些代码来执行disabled
或ngDisabled
的监视,我很乐意看到。感谢您可以尝试使用var scope=$rootscope.$new()
初始化scope
,但我不知道您是否能够从指令中查看视图中的变量,因为我认为调用您的服务的控制器更干净。我的问题不是获取范围,我的问题是如何查看禁用属性…我更新了我的响应,希望它有帮助,但没有看到更多代码,我无法帮助更多抱歉:/哦,好吧,我明白你为什么这么做了,这是遵循观察者模式并进行推送,但不幸的是,我没有访问控制器的权限,因此我无法进行推送,我需要作为观察者进行拉送。所以我真的需要看,我不能只是建议我自己的改变。你是对的,我应该提供更多的代码,或者至少提到这是一个无法访问控制器的验证服务(这是一个表单的开源工具,你可以查看一下。感谢你的努力,这很有帮助;)啊,对了,我忘了,它帮助我找到了我的问题所在,我实际上使用了ngDisabled
,因此我不得不换表,而不是使用interpolate,我不得不使用scope.$eval(element.attr('ng-disabled'))
,现在它可以工作了。。因此,如果我直接使用disabled
属性,您的代码是有效的。我根据您提出的问题进行了回答。非常高兴看到我的解决方案确实对您有所帮助。谢谢你,伙计:)