Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.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 如何在AngularJS服务中观察或观察输入属性的更改?_Javascript_Jquery_Angularjs_Angularjs Service_Angular Services - Fatal编程技术网

Javascript 如何在AngularJS服务中观察或观察输入属性的更改?

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

我的UI中有一个单选按钮,它有一个ngModel,它通过ngDisabled启用/禁用另一个输入

当一个输入元素被启用/禁用并且必须在角度服务中完成时,我想观察/观察/触发。我简直找不到该怎么做。以下是我在指令中的做法:

// 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
属性,您的代码是有效的。我根据您提出的问题进行了回答。非常高兴看到我的解决方案确实对您有所帮助。谢谢你,伙计:)