Как создать пользовательское поле ввода в angular js

Я работаю над пользовательской оболочкой ввода, которая, помимо прочего, добавляет обработку текста ошибки. Проблема в том, что я не могу сбросить значения модели, из-за проверки областей внешние области обновляются при сбросе. Внутренняя область действия директивы отсутствует, и я не уверен, почему.

Изменение часов ng-model в директиве из области видимости. недействителен, сброс должен работать и в этом случае.

Я делаю что-то ужасно неправильное? Код ниже воспроизводит проблему.

var app = angular.module('app', []);
app.directive('myInput', function() {
  return {
      restrict: "E",
      require: "ngModel",
      template: $('#myInput').html(),
      scope: {
        "ngModel": "=",
        "name": "@",
        "type": "@",
        "label": "@",
        "errorLabel": "@",
        "placeholder": "@"
      },
      link: function(scope, element, attributes, ngModel) {

        scope.$watch('ngModel', function() {
          scope.value = scope.ngModel;
          console.log('got value: ' + scope.value);
        });
        scope.$watch('value', function() {
          if(scope.value) {
            ngModel.$setViewValue(scope.value);
          }
        });
      }
  };
});

app.controller('user', ['$scope', function($scope) {
  $scope.currentUser = {
    email: "[email protected]"
  };
  $scope.resetUser = function() {
    console.log('resetting user');
    console.log($scope.user);
    $scope.user = angular.copy($scope.currentUser);
    console.log($scope.user);
  };
  $scope.submitUser = function(user) {
    console.log('submitting user');
    console.log(user);
  };
  $scope.resetUser();
}]);
.error {
  color: red;
}
.my-input {
  border: 5px solid transparent;
}
.ng-invalid.my-input {
  border: 5px solid red;
}
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.4/angular.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script type="text/html" id="myInput">
    <ng-form name="thisForm">
      <label
        ng-class="{error: thisForm.$invalid}"
        for="{{name}}"
        ng-bind="thisForm.$valid ? label : errorLabel"></label></br>
      <input
        class="my-input"
        name="{{name}}"
        type="{{type}}"
        placeholder="{{placeholder}}"
        ng-model="value"></input>
    </ng-form>
  </script>
  
</head>
<body ng-app="app">
  <div ng-controller="user">
    <ng-form name="userForm">
      <my-input
        type="email"
        ng-model="user.email"
        error-label="Enter a valid Email"
        label="Email"
        placeholder="Enter an Email"
        name="Email"></my-input>
      </br>
      <button ng-click="resetUser()">Reset</button>
      <button ng-click="submitUser(user)" ng-disabled="userForm.$invalid">Submit</button>
    </ng-form>
  </div>
  
</body>
</html>


person papodaca    schedule 11.01.2016    source источник


Ответы (1)


Если ваша оставшаяся проблема заключается в том, что ваш наблюдатель не срабатывает, когда ваш ввод недействителен (не проходит тест электронной почты Angular), это связано с тем, что Angular не обновляет вашу модель, если ввод не проходит проверку. См. эту проблему для сравнения.

В любом случае, я бы рекомендовал использовать директиву Angular ngMessages для отображения и скрытия ошибок. сообщения для входа. Похоже, вы пытаетесь создать что-то, что уже есть в готовом виде.

person vgmcglaughlin    schedule 11.01.2016
comment
В этом коде кнопка сброса сбрасывает модель до допустимого значения, это не имеет смысла, почему сброс не работает. - person papodaca; 12.01.2016