繁体   English   中英

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

[英]How to observe or watch an input attribute change in an AngularJS Service?

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

当输入元素被启用/禁用时,我想观察/观察/触发,并且必须在Angular Service中完成。 我根本找不到怎么做。 以下是我将如何在指令中执行此操作:

// 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或jqLit​​e。 可能吗?

编辑
我应该提到这个服务是独立的,并且无法访问Controller,因为它是一个表单验证工具,它不知道外部(至少不超过元素本身和他的范围)。 如果需要,您可以查看并使用它: Angular-Validation ,它支持指令和服务,具体取决于您希望验证发生的位置和位置,我的问题仅与服务中的代码相关。 pankajparkar的答案帮我解决了......谢谢:)

我相信你的属性已disabled插值,例如disabled="{{disable}}"为什么你能够将$observe放在该值上尝试将同样的东西更改为$watch将不适用于该attribute ,你需要另外需要$interpolate服务来评估属性插值。 因此,实际值将被评估是disabled还是''并且如果更改它状态,那么$watch函数将相应地被触发。

scope.$watch(function() {
   return $interpolate(element.attr('disabled'))(scope); //this will evaluate attribute value `{{}}``
}, function(newValue){
    //your code would be here
});

Scope的目的是将应用程序的表示和业务逻辑“粘合在一起”。 $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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM