programing

지시문에 양식 전달

iphone6s 2023. 3. 3. 17:08
반응형

지시문에 양식 전달

양식 필드를 명령어로 캡슐화하면 다음과 같이 간단하게 수행할 수 있습니다.

<div ng-form='myForm'>
  <my-input name='Email' type='email' label='Email Address' placeholder="Enter email" ng-model='model.email' required='false'></my-input>

</div>

에 접속하려면myForm예를 들어 유효성 검사를 수행할 수 있도록 지시합니다.myForm.Email.$valid?

명령어로 FormController에 액세스하려면 다음 절차를 수행합니다.

require: '^form',

다음으로 링크 함수의 네 번째 인수로 사용할 수 있습니다.

link: function(scope, element, attrs, formCtrl) {
    console.log(formCtrl);
}

fiddle

NgModelController에 대한 접근만 필요할 수 있습니다.

require: 'ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
     console.log(ngModelCtrl);
}

fiddle

양쪽 모두에 액세스 할 필요가 있는 경우:

require: ['^form','ngModel'],
link: function(scope, element, attrs, ctrls) {
    console.log(ctrls);
}

fiddle

다음으로 완전한 를 제시하겠습니다(부트스트랩 3.1을 사용하여 스타일링).

여기에는 여러 입력(이름, 이메일, 나이 및 국가)이 포함된 양식이 포함되어 있습니다.이름, 이메일 및 나이는 지시사항입니다.국가는 "정규" 입력입니다.

사용자가 올바른 값을 입력하지 않으면 각 입력에 대해 도움말메시지가 표시됩니다.

양식에는 저장 버튼이 포함되어 있습니다.이 버튼은 양식에 오류가 하나 이상 포함된 경우 비활성화됩니다.

<!-- index.html -->
<body ng-controller="AppCtrl">
  <script>
    var app = angular.module('app', []);

    app.controller('AppCtrl', function($scope) {
      $scope.person = {};
    });
  </script>
  <script src="inputName.js"></script>
  <script src="InputNameCtrl.js"></script>
  <!-- ... -->

  <form name="myForm" class="form-horizontal" novalidate>
    <div class="form-group">
      <input-name ng-model='person.name' required></input-name>
    </div>

    <!-- ... -->

    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-4">
        <button class="btn btn-primary" ng-disabled="myForm.$invalid">
          <span class="glyphicon glyphicon-cloud-upload"></span> Save
        </button>
      </div>
    </div>
  </form>

  Person: <pre>{{person | json}}</pre>
  Form $error: <pre>{{myForm.$error | json}}</pre>
  <p>Is the form valid?: {{myForm.$valid}}</p>
  <p>Is name valid?: {{myForm.name.$valid}}</p>
</body>

// inputName.js
app.directive('inputName', function() {
  return {
    restrict: 'E',
    templateUrl: 'input-name.html',
    replace: false,
    controller: 'InputNameCtrl',
    require: ['^form', 'ngModel'],

    // See Isolating the Scope of a Directive http://docs.angularjs.org/guide/directive#isolating-the-scope-of-a-directive
    scope: {},

    link: function(scope, element, attrs, ctrls) {
      scope.form = ctrls[0];
      var ngModel = ctrls[1];

      if (attrs.required !== undefined) {
        // If attribute required exists
        // ng-required takes a boolean
        scope.required = true;
      }

      scope.$watch('name', function() {
        ngModel.$setViewValue(scope.name);
      });
    }
  };
});

// inputNameCtrl
app.controller('InputNameCtrl', ['$scope', function($scope) {
}]);

방향성과 함께 Angular J를 형성합니다.

편집 2: 다른 이유로 도움이 될 수 있으므로 답변을 남겨두겠습니다만, Mark Rajcok의 다른 답변은 제가 원래 하고 싶었지만, 일을 시작할 수 없었습니다.여기 부모 컨트롤러는form,것은 아니다.ngForm.


지시문의 속성을 사용하여 전달할 수 있지만, 다소 상세하게 설명됩니다.

여기 작업하는 단순화된 jsFiddle이 있습니다.

코드

HTML:

<div ng-form="myForm">
    <my-input form="myForm"></my-input>
</div>

지침의 중요한 부분:

app.directive('myInput', function() {
    return {
        scope: {
            form: '='
        },
        link: function(scope, element, attrs) {
            console.log(scope.form);
        }
    };
});

무슨 일이야?

Angular에 대해 에 지정된 스코프 값을 바인딩하도록 요청했습니다.form우리의 고립된 범위에 기인한다.'='.

이렇게 하면 실제 형태가 입력 지시에서 분리됩니다.

주의: 다음을 사용해 보았습니다.require: "^ngForm"단, ngForm 디렉티브에서는 컨트롤러가 정의되어 있지 않기 때문에 그러한 방법으로 사용할 수 없습니다(안타깝습니다).


어쨌든, 이것은 매우 장황하고 지저분한 대처법이라고 생각합니다.폼 요소에 새 디렉티브를 추가하여require액세스 할 수 있습니다.제가 뭔가를 만들 수 있는지 알아보겠습니다.

편집: 상위 지시문 사용

자, 다음은 상위 지시어를 사용하여 알 수 있는 최선의 방법입니다. 자세한 내용은 잠시 후에 설명하겠습니다.

상위 지시어를 사용한 jsFiddle 작업

HTML:

<div ng-app="myApp">
    <div ng-form="theForm">
        <my-form form="theForm">
            <my-input></my-input>
        </my-form>
    </div>
</div>

JS(부분):

app.directive('myForm', function() {
    return {
        restrict: 'E',
        scope: {
            form: '='
        },
        controller: ['$scope', function($scope) {
            this.getForm = function() {
                return $scope.form;
            }
        }]
    }
});

app.directive('myInput', function() {
    return {
        require: '^myForm',
        link: function(scope, element, attrs, myForm) {
            console.log(myForm.getForm());
        }
    };
});

부모 디렉티브스코프에 폼이 저장됩니다(myForm부모 폼을 요구함으로써 자녀 디렉터가 액세스 할 수 있도록 합니다(require: '^myForm'링크 기능에서 디렉티브의 컨트롤러에 액세스 합니다(myForm.getForm()를 참조해 주세요.

이점:

  • 양식을 한 곳에서만 식별하면 됩니다.
  • 부모 컨트롤러를 사용하여 공통 코드를 저장할 수 있습니다.

부정:

  • 추가 노드가 필요합니다.
  • 양식 이름을 두 번 입력해야 합니다.

내가 원하는 것

요소의 속성을 사용하여 작업을 수행하려고 했습니다.이 작업이 성공했을 경우 명령어를 다음과 같은 요소에 추가하면 됩니다.ngForm.

스코프에서 「 」의 「 」를 사용하고 있었습니다.myFormName는 변수표표 variable variable variable variable variable variable variable variable variable에 표시됩니다.$scope단, ,이 됩니다.undefined요.그것은 나를 혼란스럽게 한다.

AngularJS.5(AngularJS 1.5.0을 ) 더.link직접 기능합니다).「」에 하고 .FormController 「CHANGE」를 탭 할 수 .require다음과 같이 명령어로 속성을 지정합니다.

return {
  restrict : 'EA',
  require : {
    form : '^'
  },
  controller : MyDirectiveController,
  controllerAs : 'vm',
  bindToController : true,
  ...
};

다음으로 템플릿 또는 디렉티브컨트롤러에서 다른 스코프 변수와 같이 액세스 할 수 있습니다.예를 들어 다음과 같습니다.

function MyDirectiveController() {
  var vm = this;
  console.log('Is the form valid? - %s', vm.form.$valid);
}

하려면 , 「」도 합니다.bindToController: trueAtribute를 지정합니다.다음의 메뉴얼을 참조해 주세요.$compile자세한 내용은 이 질문을 참조하십시오.

문서의 관련 부품:

요구하다

다른 디렉티브를 요구하여 링크 함수의 네 번째 인수로 해당 컨트롤러를 주입합니다.필수 속성은 문자열, 배열 또는 개체일 수 있습니다.

require 속성이 오브젝트이고bindToController트러티하다필요한 컨트롤러는 require 속성의 키를 사용하여 컨트롤러에 바인드됩니다.필요한 컨트롤러의 이름이 로컬 이름(키)과 같을 경우 이름을 생략할 수 있습니다.를 들어, 「」라고 하는 것은,{parentDir: '^parentDir'} {parentDir: '^'}.

'내가 원하는 것' 바이올린을 작동시켰어!어떤 이유로 console.log에 "$scope.ngForm" 문자열이 표시될 수 있지만 직접 로깅이 작동하지 않아 정의되지 않았습니다.단, 컨트롤러 함수에 Atribut을 전달하면 얻을 수 있습니다.

app.directive('myForm', function() {
return {
    restrict: 'A',
    controller: ['$scope','$element','$attrs', function($scope,$element,$attrs) {
        this.getForm = function() {
            return $scope[$attrs['ngForm']];
        }
    }]
}
});

http://jsfiddle.net/vZ6MD/20/

언급URL : https://stackoverflow.com/questions/17618318/pass-form-to-directive

반응형