[javascript] Ng- 모델은 컨트롤러 값을 업데이트하지 않습니다
아마도 어리석은 질문이지만 간단한 입력과 버튼으로 HTML 양식이 있습니다.
<input type="text" ng-model="searchText" />
<button ng-click="check()">Check!</button>
{{ searchText }}
그런 다음 컨트롤러에서 (템플릿 및 컨트롤러는 routeProvider에서 호출됩니다) :
$scope.check = function () {
console.log($scope.searchText);
}
버튼을 클릭 할 때 콘솔에서보기가 올바르게 업데이트되었지만 정의되지 않은 이유는 무엇입니까?
감사!
업데이트 : 실제로이 문제를 해결 한 것처럼 보입니다 (일부 해결 방법이 필요합니다). 내 속성 이름을에서 (으) searchText
로 변경 search.text
한 다음 $scope.search = {};
컨트롤러와 voila에 빈 객체 를 정의 해야했습니다 … 왜 작동하는지 모르겠습니다. 그러나 ;]
답변
버전 별 컨트롤러 (권장)
여기 템플릿
<div ng-app="example" ng-controller="myController as $ctrl">
<input type="text" ng-model="$ctrl.searchText" />
<button ng-click="$ctrl.check()">Check!</button>
{{ $ctrl.searchText }}
</div>
JS
angular.module('example', [])
.controller('myController', function() {
var vm = this;
vm.check = function () {
console.log(vm.searchText);
};
});
예 : http://codepen.io/Damax/pen/rjawoO
Angular 2.x 또는 Angular 1.5 이상에서 구성 요소를 사용하는 것이 가장 좋습니다.
########
옛날 방식 (권장하지 않음)
문자열은 원시적이므로 대신 객체를 사용하는 것이 좋습니다.
마크 업에서 이것을 시도하십시오
<input type="text" ng-model="searchText" />
<button ng-click="check(searchText)">Check!</button>
{{ searchText }}
그리고 이것은 컨트롤러에서
$scope.check = function (searchText) {
console.log(searchText);
}
답변
“ng-model을 사용한다면 거기에 점이 있어야합니다.”
모델이 object.property를 가리 키도록하고 나면 좋을 것입니다.
제어 장치
$scope.formData = {};
$scope.check = function () {
console.log($scope.formData.searchText.$modelValue); //works
}
주형
<input ng-model="formData.searchText"/>
<button ng-click="check()">Check!</button>
이는 자식 경로 나 ng-repeats와 같은 자식 범위가 재생 중일 때 발생합니다. 자식 범위는 자체 가치를 만들고 여기에 설명 된대로 이름 충돌이 발생 합니다 .
자세한 내용은이 비디오 클립을 참조하십시오 : https://www.youtube.com/watch?v=SBwoFkRjZvv&&
답변
AngularJS를 사용한 웹 응용 프로그램 개발 책 p.19에서는 다음과 같이 작성되었습니다.
범위 속성에 직접 바인딩을 피하십시오. 범위에 노출 된 개체 속성에 대한 양방향 데이터 바인딩이 선호되는 접근 방식입니다. 경험상 ng-model 지시문에 제공된 표현식에 점이 있어야합니다 (예 : ng-model = “thing.name”).
범위는 JavaScript 객체 일 뿐이며 dom 계층 구조를 모방합니다. JavaScript Prototype Inheritance 에 따르면 범위 속성은 범위를 통해 분리됩니다. 이를 피하려면 도트 표기법 을 사용하여 ng 모델을 바인딩해야합니다.
답변
작품 this
대신 사용 $scope
.
function AppCtrl($scope){
$scope.searchText = "";
$scope.check = function () {
console.log("You typed '" + this.searchText + "'"); // used 'this' instead of $scope
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app>
<div ng-controller="AppCtrl">
<input ng-model="searchText"/>
<button ng-click="check()">Write console log</button>
</div>
</div>
편집 : 이 답변을 작성할 때 나는 이것보다 훨씬 복잡한 상황을 겪었습니다. 논평 후에, 나는 그것이 왜 효과가 있는지 이해하기 위해 그것을 재현하려고 노력했지만 운이 없다. 어떻게 든 새로운 이유가 생성되고 this
그 범위를 참조한다고 생각합니다. 그러나 $scope
사용되는 경우 실제로 Javascript의 어휘 범위 기능으로 인해 상위 $ scope를 나타냅니다 .
이 문제가있는 사람이 이런 식으로 테스트하고 알려 주면 좋을 것입니다.
답변
나는 같은 문제가 있었고 컨트롤러의 맨 앞에 빈 객체를 먼저 선언하지 않았기 때문입니다.
$scope.model = {}
<input ng-model="model.firstProperty">
이것이 당신을 위해 작동하기를 바랍니다!
답변
사소한보기 (중첩 범위가 있음)를 처리 할 때 동일한 문제가 발생했습니다. 그리고 마침내 프로토 타입 기반의 자바 스크립트 상속 특성으로 인해 AngularJS 애플리케이션을 개발할 때 이것이 알려진 까다로운 일이라는 것을 발견했습니다. AngularJS 중첩 범위는이 메커니즘을 통해 생성됩니다. 그리고 ng-model에서 생성 된 값은 부모 범위 (컨트롤러에 주입 된 것일 수도 있음)에 값이 표시되지 않는다고 말하지 않고 자식 범위에 배치됩니다. 점을 사용하지 않으면 값이 부모 범위에 정의 된 동일한 이름을 가진 모든 속성을 음영 처리합니다 프로토 타입 참조 액세스를 시행합니다. 자세한 내용은이 문제를 설명하기위한 온라인 비디오 ( http://egghead.io/video/angularjs-the-dot/) 와 그 뒤의 설명을 확인하십시오.
답변
이 바이올린을보십시오 http://jsfiddle.net/ganarajpr/MSjqL/
나는 당신이하고있는 일을 정확하게 수행했으며 작동하는 것 같습니다. 여기서 작동하지 않는 것을 확인할 수 있습니까?