2013-10-24 2 views
0

Кажется, что функция checkZip запускается до того, как пользовательский zip привязан к параметру. Есть ли лучший способ сделать это с помощью углового инструмента? Я хочу начать следующий шаг в пользовательском потоке, как только они набрали правильный почтовый индекс.Угловая функция срабатывает перед обновлением модели: проверка кода на Zipcode

HTML

<input type="text" placeholder="Zipcode" ng-model="zip" ng-change="checkZip('{{zip}}')"> 

Javascript

// Zipcode Key 
$scope.zipKey = [94203, 94204, 94205]; 

// Zipcode checker 
$scope.checkZip = function(zip) { 
    var key = $scope.zipKey; 
    if (zip.length == 5) { 
     for(var i = 0;i<key.length;i++) { 
      if (key[i] == zip) { 
       // Initiate State Change 
       $scope.successAlert = 'We serve in your area!'; 
      } 
     } 
    } 
} 
+1

Не возвращайте модель назад, у вас уже есть доступ к ней через '$ scope.zip' – tymeJV

+0

, вы также можете дождаться, что $ dirty подала на эту форму. Таким образом, вы знаете, что это было изменено. – jbenowitz

ответ

2

Вы бы лучше использовать угловую форму проверки и записи пользовательских валидаторов.

Это a great article, охватывающее все, что вам нужно знать об этом.

Для ваших потребностей, вы можете написать директиву, как этот:

app.directive('ensureZipcode', function() { 
    return { 
    require: 'ngModel', 
    link: function(scope, element, attrs, modelController) { 
     scope.$watch(attrs.ngModel, function() { 
     valid = true // or false, implement your logic here 
     modelController.$setValidity('zipcode', valid); 
     }); 
    } 
    } 
}); 

Небольшое примечание здесь: modelController устанавливается в качестве четвертого параметра функции link, потому что мы указали require: 'ngModel'.

+0

Вы не используете '$ http', возможно, его не нужно включать –

+0

+1 за предложение нестандартного метода проверки формы –

+0

@NuclearGhost: обязательно! Я скопировал/вставил его слишком быстро;) –

Смежные вопросы