2015-02-20 2 views
0

У меня есть знак в форме, которая требует набора ошибок. Дело в том, что этот знак в форме скользит слева с помощью специальной директивы. Когда я хочу вытащить его из поля зрения, мне нужно, чтобы текущая ошибка исчезла. Я установил функцию $watch, чтобы следить за изменениями в сервисной функции sharedInfo.getError(), но она работает только при загрузке контроллера и прекращении прослушивания изменений. Кажется, я не могу заставить это работать, я использовал его так, как прежде, без каких-либо трудностей. Я мог бы использовать некоторую помощь в отслеживании неисправности.

Контроллер:

forumApp.controller('signinCtrl', ['$scope', 'fbRef', 'validation', 'userLogic', 'sharedInfo', function($scope, fbRef, validation, userLogic, sharedInfo) { 

    $scope.$watch('sharedInfo.getError()', function(newValue, oldValue) { 
     console.log(oldValue); 
     console.log(newValue); 
     $scope.error = newValue; 
    }); 

    $scope.user = { 
     email: '', 
     password: '' 
    } 

    $scope.validate = function() { 

     $scope.error = validation.validateSignin($scope.user, $scope.error); 

     if ($scope.error) { 
      return false; 
     } 
     else { 
      userLogic.signinUser($scope.user).then(function(authData) { 
       sharedInfo.setAuthState(authData); 
      }).catch(function(error) { 

       switch (error.code) { 

        case 'INVALID_USER': 
         $scope.error = 'Invalid email'; 
         sharedInfo.setError($scope.error); 
         break; 

        case 'INVALID_EMAIL': 
         $scope.error = 'Invalid email format'; 
         sharedInfo.setError($scope.error); 
         break;  

        case 'INVALID_PASSWORD': 
         $scope.error = 'Invalid password'; 
         sharedInfo.setError($scope.error); 
         break; 
       } 
      }); 
     } 
    } 
}]); 

служба, которая отслеживает любой общей информации по контроллерам:

forumApp.service('sharedInfo', [function() { 

    var authState; 
    var error; 

    return { 
     getAuthState: function() { 
      return authState; 
     }, 
     setAuthState: function(authData) { 
      authState = authData; 
     }, 
     getError: function() { 
      return error; 
     }, 
     setError: function(newError) { 
      error = newError; 
     } 
    } 
}]); 

директива, которая выполняет слайд:

forumApp.directive('mySigninSlide', ['sharedInfo', function(sharedInfo) { 
    return { 
     restrict: 'A', 
     link: function($scope, element, attrs) { 

      element.on('click', function() { 

       var sidebar = $('#signin-wrapper'); 

       if ($scope.isAnimated === undefined || 
        $scope.isAnimated === false) { 

        sidebar.stop().animate({left: '340px'}); 
        $scope.isAnimated = true; 
       } 
       else { 
        sidebar.stop().animate({left: '-606px'}); 
        $scope.isAnimated = false; 
        sharedInfo.setError(''); 
       } 
      }); 
     } 
    }; 
}]); 
+0

'$ scope. $ Watch' наблюдает за значениями' $ scope'. 'sharedInfo' не существует в' $ scope'. Отсюда и ваша проблема. Часы пытаются найти '$ scope.sharedInfo.getError()'. – Cineris

+0

Код, который вы ищете, это '$ scope. $ Watch (function() {return sharedInfo.getError();}, function (newValue) {$ scope.error = newValue;});', но это isn ' Это очень хороший способ настроить ситуацию. Услуги, как синглтоны, обычно не предназначены для хранения государства. – DRobinson

+0

@DRobinson Мне хотелось бы услышать лучшее решение, если вы опубликуете его как ответ. – Chrillewoodz

ответ

1

Другим вариантом было бы поставить sharedInfo на сферу.

$scope.sharedInfo = sharedInfo; 
$scope.$watch('sharedInfo.getError()', function(newValue, oldValue) { 
    ... 
}); 
1

У вас есть чтобы вернуть значение того, что вы смотрите, чтобы эффективно наблюдать за ним

$scope.$watch(sharedInfo.getError(), function(newValue, oldValue) { 
     console.log(oldValue); 
     console.log(newValue); 
     $scope.error = newValue; 
    }); 

или

$scope.$watch(function() { return sharedInfo.getError(); }, 
    function(newValue, oldValue) { 
    console.log(oldValue); 
    console.log(newValue); 
    $scope.error = newValue; 
}); 
Смежные вопросы