Как наблюдать или наблюдать за изменением входного атрибута в службе AngularJS?

У меня есть переключатель в моем пользовательском интерфейсе с ngModel, и он включает/отключает другой ввод через ngDisabled.

Я хочу наблюдать/наблюдать/запускать, когда элемент ввода становится включенным/отключенным, и это нужно сделать в службе Angular. Я просто не могу найти, как это сделать. Вот как я бы сделал это в директиве:

// 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(), но я хочу придерживаться ванильного javascript или jqLite. Является ли это возможным?

EDIT
Я должен был упомянуть, что эта Служба является самостоятельной и не имеет доступа к Контроллеру, потому что это инструмент проверки формы, и он не знает о внешнем (по крайней мере, не более чем сам элемент и его область действия). Вы можете проверить и использовать его, если хотите: Angular-Validation, и он поддерживает Directive и Сервис в зависимости от того, что или где вы хотите, чтобы проверка происходила, и моя проблема была связана только с кодом в Сервисе. Ответ от pankajparkar помог мне решить эту проблему... Спасибо :)


person ghiscoding    schedule 05.06.2015    source источник


Ответы (2)


Я полагаю, что у вас был атрибут 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
});
person Pankaj Parkar    schedule 05.06.2015
comment
ах да, я забыл об этом, это помогло мне найти, в чем была моя проблема, я на самом деле использую ngDisabled, и поэтому мне пришлось изменить свои часы для этого, и вместо использования интерполяции я должен был использовать scope.$eval(element.attr('ng-disabled')) и теперь это работает.. Так что да ваш код действителен, если я использую непосредственно атрибут disabled. - person ghiscoding; 06.06.2015
comment
Я ответил на основе того, что вы задали в вопросе. Очень рад видеть, что мое решение действительно вам помогает. Спасибо чувак :) - person Pankaj Parkar; 06.06.2015

Цель 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();
}
person deKajoo    schedule 05.06.2015
comment
Спасибо за ответ, у меня есть scope в моей службе по другим причинам. Но, как я уже говорил, мне не удалось заставить его работать с scope.$watch, я хочу наблюдать за изменением атрибута, а не значения... Итак, как мне это сделать? Если бы вы могли прислать код, который отслеживает disabled или ngDisabled, я был бы рад увидеть. Спасибо - person ghiscoding; 05.06.2015
comment
возможно, попробуйте инициализировать scope с помощью var scope = $rootscope.$new(), но я не знаю, сможете ли вы просмотреть переменную в представлении из директивы, я думаю, что контроллер, который будет вызывать вашу службу, намного чище. - person deKajoo; 05.06.2015
comment
Моя проблема не в том, чтобы получить область, моя проблема в том, как посмотреть отключенный атрибут... - person ghiscoding; 05.06.2015
comment
Я обновил свой ответ, надеюсь, это поможет, но, не видя больше кода, я больше не могу помочь, извините:/ - person deKajoo; 05.06.2015
comment
О, хорошо, я понимаю, почему вы это сделали, то есть следуете шаблону наблюдателей и делаете push, но, к сожалению, у меня нет доступа к контроллеру, поэтому я не могу сделать push, мне нужно сделать pull как наблюдателю. Так что мне действительно нужно смотреть, я не могу просто посоветовать изменение самостоятельно. Вы правы, я должен предоставить больше кода или, по крайней мере, упомянуть, что это служба проверки, которая не имеет доступа к контроллеру (это инструмент с открытым исходным кодом для формы, вы можете проверить его Angular-Validation. Спасибо за усилия, это помогает;) - person ghiscoding; 06.06.2015