AngularJS-ng-model을 사용하면 입력 텍스트 상자의 값 속성이 무시됩니까?


218

간단한 입력 텍스트 상자 값을 아래 "bob"과 같은 값으로 설정 한 경우 AngularJS 사용 ng-model속성이 추가 되면 값이 표시되지 않습니다 .

    <input type="text"
           id="rootFolder"
           ng-model="rootFolders"
           disabled="disabled"
           value="Bob"
           size="40"/>

누구나이 입력을 무언가로 기본 설정하고 ng-model? ng-bind기본값 을 사용하여 시도했지만 작동하지 않는 것 같습니다.

답변:


223

원하는 동작이므로 뷰가 아닌 컨트롤러에서 모델을 정의해야합니다.

<div ng-controller="Main">
  <input type="text" ng-model="rootFolders">
</div>


function Main($scope) {
  $scope.rootFolders = 'bob';
}

11
감사. 그러나이 경우 모델은 컨트롤러에서 설정됩니다. Angular 문서에서는 항상 동일하며 데이터는 컨트롤러에 설정됩니다. 그러나 내 컨트롤러는 JS 파일에 있습니다. "편집"양식에있을 때 어떻게해야합니까? 기본 양식 데이터를 컨트롤러 "각도"로 전달하는 방법은 무엇입니까?
ByScripts December

8
이것은 작동하지 않지만 Mark Rajcok (ng-init = "rootFolders = 'Bob'")에 의해 표시된 추가 속성 ng-init를 추가하면 정상적으로 작동합니다.
Kaizar Laxmidhar

<input type = "number"ng-model = "newTransaction [$ index] [user.email]"/>과 같은 입력 필드가있는 경우 기본값을 어떻게 설정합니까?
shish

188

Vojta는 "Angular way"를 설명했지만 실제로이 작업을 수행해야하는 경우 @urbanek은 최근 ng-init를 사용하여 해결 방법을 게시했습니다.

<input type="text" ng-model="rootFolders" ng-init="rootFolders='Bob'" value="Bob">

https://groups.google.com/d/msg/angular/Hn3eztNHFXw/wk3HyOl9fhcJ


33
'value = "Bob"'부분이 필요하지 않을 수 있습니다.
Mark Rajcok

2
+1이지만 링크 된 토론에 대한 게시물 중 하나에서 언급했듯이 피해야합니다 (논리적으로 덜 정확하고 테스트를 어렵게 함).
0xc0de 5

1
이 방법은 v1.2에서도 모델 값을 사용하면 제대로 작동합니다. <... ng-init = "rootFolders = someModelAttribute"...>
dmcqu314

@ MarkRajcok, Stack Overflow에 많은 AngularJS 게시물이 있습니다! 귀하의 통찰력을 SO 커뮤니티와 공유하는 데 전념해 주셔서 감사합니다. 나는 당신이 우리를 구해준 모든 시간을 진심으로 감사한다고 말할 때 많은 안심 개발자에게 말할 것입니다!
Jeremy Moritz

1
내 문제를 해결 한 Mark의 답변에 진심으로 감사드립니다. value="Bob"입력 태그에 참여할 필요가 없음을 확인합니다 .
Devner

68

입력 지시문을 재정의하면 작업을 수행하는 것 같습니다. Dan Hunsaker 의 코드 를 약간 변경했습니다 .

  • $parse().assign()ngModel 속성이없는 필드 에서 사용하기 전에 ngModel 검사를 추가했습니다 .
  • assign()기능 매개 변수 순서를 수정했습니다 .
app.directive('input', function ($parse) {
  return {
    restrict: 'E',
    require: '?ngModel',
    link: function (scope, element, attrs) {
      if (attrs.ngModel && attrs.value) {
        $parse(attrs.ngModel).assign(scope, attrs.value);
      }
    }
  };
});

이것은 내가 찾은 최고의 답변입니다! ... 내 문제를 우아한 방식으로 해결합니다. 숨겨진 입력 (서버에서 생성 된 Symfony 양식 토큰)의 값을 캡처해야했습니다.
PachinSV

이것은 영리 할뿐만 아니라 최상의 솔루션입니다. 필자의 경우, PHP 양식이기 때문에 컨트롤러에서 ng-model의 기본값을 설정할 수 없습니다. 서버 측 유효성 검사에 실패하면 양식이 새로 고쳐지고 ng-model의 모든 항목이 입력 값을 삭제하지 못합니다. 너무.
Luis Elizondo

2
JavaScript없이 HTML 형식의 기본 버전을 사용하려는 경우이 방법이 가장 좋습니다.
Darren

각도 자체 내에서 기본적으로 구성 할 수없는 옵션이어야하는 탁월한 솔루션입니다.
Gracie

솔루션 주셔서 감사합니다. 숫자 입력 문제를 어떻게 해결 하시겠습니까? 그것은 오류가 발생 docs.angularjs.org/error/ngModel/numfmt?p0=20.12
mate.gwozdz

21

각도 방식

이 작업을 수행하는 올바른 각도 방법은 양식 페이지에 단일 페이지 앱 AJAX를 작성한 다음 모델에서 동적으로 채우는 것입니다. 모델은 단일 진실 소스이므로 모델은 기본적으로 양식에서 채워지지 않습니다. 대신 Angular는 다른 방향으로 가고 모델에서 양식을 채우려 고 시도합니다.

그러나 처음부터 다시 시작할 시간이 없다면

앱을 작성했다면 상당히 많은 아키텍처 변경이 필요할 수 있습니다. 전체 단일 페이지 앱을 처음부터 구성하는 대신 Angular를 사용하여 기존 양식을 향상시키려는 경우 지시문을 사용하여 양식에서 값을 가져 와서 링크 타임에 범위에 저장할 수 있습니다. 그러면 Angular는 범위의 값을 다시 폼에 바인딩하고 동기화 상태를 유지합니다.

지시문 사용

비교적 간단한 지시문을 사용하여 양식에서 값을 가져 와서 현재 범위로로드 할 수 있습니다. 여기에 initFromForm 지시어를 정의했습니다.

var myApp = angular.module("myApp", ['initFromForm']);

angular.module('initFromForm', [])
  .directive("initFromForm", function ($parse) {
    return {
      link: function (scope, element, attrs) {
        var attr = attrs.initFromForm || attrs.ngModel || element.attrs('name'),
        val = attrs.value;
        if (attrs.type === "number") {val = parseInt(val)}
        $parse(attr).assign(scope, val);
      }
    };
  });

모델 이름을 얻기 위해 몇 가지 폴백을 정의한 것을 볼 수 있습니다. 이 지시문을 ngModel 지시문과 함께 사용하거나 원하는 경우 $ scope 이외의 다른 항목에 바인딩 할 수 있습니다.

다음과 같이 사용하십시오.

<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}

이것은 텍스트 영역에서도 작동하며 드롭 다운을 선택하십시오.

<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}


1
훌륭한 솔루션이지만와 만 작동합니다 input="text". 당신이있는 경우 number가 발생합니다 모델 유형이 아닌 number docs.angularjs.org/error/ngModel/numfmt?p0=333
smoksnes

2
숫자를 지원하기 위해 추가 할 수 있습니다 if (attrs.type === "number") val = parseInt(val);
smoksnes

@ smoksnes-당신은 절대적으로 정확합니다. 나는 대답을 업데이트했다 :)
superluminary

7

업데이트 : 내 컨트롤러에는 DOM 인식 코드가 포함되어있어 HTML을 선호하는 각도 규칙을 위반했습니다. @dmackerman은 내 대답에 대한 의견에서 지시문을 언급했으며 지금까지는 완전히 놓쳤습니다. 이 입력을 통해 Angular 또는 HTML 규칙 을 위반하지 않고이를 수행 하는 올바른 방법이 있습니다 .


요소의 값을 가져 와서 지시문에서 모델을 업데이트하는 데 사용하는 방법도 있습니다.

<div ng-controller="Main">
    <input type="text" id="rootFolder" ng-model="rootFolders" disabled="disabled" value="Bob" size="40" />
</div>

그리고:

app.directive('input', ['$parse', function ($parse) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function (scope, element, attrs) {
            if(attrs.value) {
                $parse(attrs.ngModel).assign(scope, attrs.value);
            }
        }
    };
}]);

물론 속성을 Angular 표현식으로 취급하는 데 value사용하는 $parse(attrs.value, scope)것을 포함하여 모델을 값으로 설정하기 전에 속성으로 더 많은 작업을 수행하도록 위의 지시문을 수정할 수 있습니다 value(개인적으로는 다른 [custom] 속성을 사용하지만, 표준 HTML 속성은 일관되게 상수로 취급됩니다).

또한 ng-model에 템플릿 데이터를 사용할 수있게 만드는 것과 비슷한 질문 이 있습니다.


컨트롤러에서 DOM 조작 / 검색을 수행해서는 안됩니다. 대신 지시문을 사용해야합니다.
dmackerman

2
나는 내 대답에서 그 단점을 분명히 언급했다. 당신은 해야하지 ,하지만 당신은 할 수 있습니다 . 그것은 모두 Angular 또는 HTML 규칙을 따르는 것이 더 중요한지 여부에 달려 있습니다. Angular는 HTML을 깨뜨리기 때문입니다.
Dan Hunsaker

3
아, 나는 더미. 지시문 사용에 관한 부분을 완전히 놓쳤습니다. 이에 따라 답변이 업데이트되었습니다. @dmackerman, 당신에게 바보가 된 것에 대해 진심으로 사과드립니다.
Dan Hunsaker

지시에 감사드립니다! 콘텐츠 서버 측을 생성 한 다음 클라이언트에서 내 모델로 사용해야하는 프로젝트에서 적용 할 아이디어를 얻었습니다.
ggalmazor

기꺼이 도와 드리겠습니다. 물론 일반적으로 말하면 서버 측 콘텐츠를 JSON으로 작성하고 앱이이를 기반으로 모델을 조작하도록하려는 경우도 있지만 다른 옵션을 갖는 것이 유용 할 수도 있습니다.
Dan Hunsaker

7

AngularJs ngModel 지시문을 사용하는 경우 value속성 값이 ngModel 필드에서 바인딩되지 않습니다. 기억 하십시오. 직접 입력해야하며이를 수행하는 가장 좋은 방법은 다음과 같습니다.

<input type="text"
       id="rootFolder"
       ng-init="rootFolders = 'Bob'"
       ng-model="rootFolders"
       disabled="disabled"
       value="Bob"
       size="40"/>

컨트롤러 대신 지시문 / 마크 업에서 초기화하는 것이 이상하다고 느낍니다.
random_user_name

5

이것은 이전 답변에 대한 약간의 수정입니다 ...

$ 구문 분석이 필요하지 않습니다

angular.directive('input', [function () {
  'use strict';

  var directiveDefinitionObject = {
    restrict: 'E',
    require: '?ngModel',
    link: function postLink(scope, iElement, iAttrs, ngModelController) {
      if (iAttrs.value && ngModelController) {
        ngModelController.$setViewValue(iAttrs.value);
      }
    }
  };

  return directiveDefinitionObject;
}]);

ngModelController. $ setViewValue는 모델 상태를 dirty로 변경하고 원래 상태를 false로 변경하여 시간이 걸리는 양식 상태에 영향을 미칩니다.
Atul Chaudhary

2

안녕하세요 모델을 초기화하여 아래 방법을 시도해 볼 수 있습니다.

여기서 텍스트 상자의 ng-model을 양방향으로 초기화 할 수 있습니다

-ng-init 사용

-js에서 $ scope 사용

<!doctype html>
 <html >
 <head>
        <title>Angular js initalize with ng-init and scope</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
</head>
<body ng-app="app" >
    <h3>Initialize value with ng-init</h3>
    <!-- Initlialize model values with ng-init -->
    <div ng-init="user={fullname:'Bhaskar Bhatt',email:'bhatt.bhaskar88@gmail.com',address:'Ahmedabad'};">
        Name : <input type="text" ng-model="user.fullname" /><br/>
        Email : <input type="text" ng-model="user.email" /><br/>
        Address:<input type="text" ng-model="user.address" /><br/>

    </div>  
    <!-- initialize with js controller scope -->
    <h3>Initialize with js controller</h3>

    <div  ng-controller="alpha">
        Age:<input type="text" name="age" ng-model="user.age" /><br/>
        Experience : <input type="text" name="experience" ng-model="user.exp" /><br/>
        Skills : <input type="text" name="skills" ng-model="user.skills" /><br/>
    </div>  

</body> 
<script type="text/javascript">
        angular.module("app",[])
        .controller("alpha",function($scope){
            $scope.user={};
            $scope.user.age=27;
            $scope.user.exp="4+ years";
            $scope.user.skills="Php,javascript,Jquery,Ajax,Mysql";
        });

     </script>
 </html>                

0

문제는 ng-model을 ng-value / value를 설정하려는 상위 요소로 설정해야한다는 것입니다. Angular가 언급했듯이 :

입력 [라디오] 및 옵션 요소에 주로 사용되므로 요소를 선택할 때 해당 요소 (또는 선택 상위 요소)의 ngModel이 바운드 값으로 설정됩니다.

예 : 실행 된 코드입니다.

<div class="col-xs-12 select-checkbox" >
<label style="width: 18em;" ng-model="vm.settingsObj.MarketPeers">
  <input name="radioClick" type="radio"  ng-click="vm.setPeerGrp('market');" 
         ng-value="vm.settingsObj.MarketPeers" 
         style="position:absolute;margin-left: 9px;">
  <div style="margin-left: 35px;color: #717171e8;border-bottom: 0.5px solid #e2e2e2;padding-bottom: 2%;">Hello World</div>
</label>
</div>

참고 : 위의 경우에 이미 ng-model 및 값에 대한 JSON 응답이 있었으므로 JS 객체에 다른 속성을 "MarketPeers"로 추가하고 있습니다. 따라서 모델과 가치는 필요에 따라 다를 수 있지만 ng-model과 가치는 있지만 동일한 요소에 두지 않는 것이이 프로세스가 도움이 될 것이라고 생각합니다.


0

비슷한 문제가있었습니다. value="something"표시하고 편집하는 데 사용할 수 없었습니다 . <input>선언 된 모델과 함께 아래 명령을 사용해야했습니다 .

[(ngModel)]=userDataToPass.pinCode

객체에 데이터 목록이 userDataToPass있고 표시하고 편집 해야하는 항목은 pinCode입니다.

동일하게, 나는 이 YouTube 비디오를 참조


이 howTo에 대해 OP는 AngularJS를 사용하고 YT 비디오 참조는 Angular 4를 사용합니다.
Chris22
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.