Ng-модель не обновляет значение контроллера
вероятно, глупый вопрос, но у меня есть моя html-форма с простым вводом и кнопкой:
<input type="text" ng-model="searchText" />
<button ng-click="check()">Check!</button>
{{ searchText }}
затем в контроллере (шаблон и контроллер вызываются из routeProvider):
$scope.check = function () {
console.log($scope.searchText);
}
почему я вижу взгляд правильно, но undefined в консоли при нажатии на кнопку?
спасибо!
обновление:
Кажется, я действительно решил эту проблему (до того, как пришлось придумать некоторые обходные пути) с:
Только нужно было изменить мою собственность имя от searchText
to search.text
, затем определить пустые $scope.search = {};
объект в контроллере и вуаля... Понятия не имею, почему он работает;]
13 ответов
контроллер as версия (рекомендуется)
здесь шаблон
<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
лучше всего будет использовать компонент с угловым 2.x или угловой 1.5 или верхний
########старый способ (не рекомендуется)
это не рекомендуется, потому что строка является примитивом, настоятельно рекомендуется использовать объект вместо
попробуйте это в вашей разметке
<input type="text" ng-model="searchText" />
<button ng-click="check(searchText)">Check!</button>
{{ searchText }}
и это в ваш контроллер
$scope.check = function (searchText) {
console.log(searchText);
}
" Если вы используете ng-модель, у вас должна быть точка."
Сделайте так, чтобы ваша модель указывала на объект.собственность, и ты сможешь уйти.
контроллер
$scope.formData = {};
$scope.check = function () {
console.log($scope.formData.searchText.$modelValue); //works
}
шаблон
<input ng-model="formData.searchText"/>
<button ng-click="check()">Check!</button>
это происходит, когда дочерние области находятся в игровых дочерних маршрутах или ng - повторах.
Дочерняя область создает собственное значение, и рождается конфликт имен как показано здесь:
посмотреть это видео клип для более:https://www.youtube.com/watch?v=SBwoFkRjZvE&t=3m15s
в освоении разработки веб-приложений с помощью AngularJS book p.19, написано, что
избегайте прямых привязок к свойствам области. Двусторонняя привязка данных к предпочтительным подходом являются свойства объекта (предоставляемые в области). Как правило, вы должны иметь точку в выражении, предоставляемых директива ng-model (например, ng-model= " вещь.имя").
области-это просто объекты JavaScript, и они имитируют иерархию dom. Согласно Наследование Прототипа JavaScript свойства области разделены по областям. Чтобы избежать этого, точку следует использовать для привязки 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>
Edit: во время написания этого ответа у меня была гораздо более сложная ситуация, чем эта. После комментариев я попытался воспроизвести его, чтобы понять, почему он работает, но не повезло. Я думаю, что как-то (не знаю, почему) генерируется новая дочерняя область и this
относится к этой области. Но если ... --3--> используется, он фактически относится к родительской области $из-за javascript лексической области характеристика.
было бы здорово, если кто-то, имеющий эту проблему, проверяет этот путь и сообщает нам.
У меня была та же проблема, и это было связано с тем, что я не объявлял пустой объект сначала в верхней части моего контроллера:
$scope.model = {}
<input ng-model="model.firstProperty">
надеюсь, это будет работать для вас!
Я столкнулся с той же проблемой при работе с нетривиальным представлением (есть вложенные области). И, наконец, обнаружил, что это известная хитрость при разработке приложения AngularJS из-за природы прототипного наследования java-скрипта. С помощью этого механизма создаются вложенные области AngularJS. И значение, созданное из ng-модели, помещается в дочернюю область, не говоря, что родительская область (возможно, введенная в контроллер) не увидит значение, значение также затенит любую свойство с тем же именем, определенным в родительской области, если не использовать точку для принудительного доступа к ссылке прототипа. Для получения более подробной информации проверьте онлайн-видео, чтобы проиллюстрировать эту проблему,http://egghead.io/video/angularjs-the-dot/ и комментарии, следующие за ним.
посмотрите на эту скрипку http://jsfiddle.net/ganarajpr/MSjqL/
У меня ( я предполагаю! ) сделал именно то, что вы делали, и, похоже, это работает. Можете ли вы проверить, что не работает здесь?
для меня проблема была решена путем заполнения моих данных в объект (здесь "данные").
NgApp.controller('MyController', function($scope) {
$scope.my_title = ""; // This don't work in ng-click function called
$scope.datas = {
'my_title' : "",
};
$scope.doAction = function() {
console.log($scope.my_title); // bad value
console.log($scope.datas.my_title); // Good Value binded by'ng-model'
}
});
Я надеюсь, что это поможет
поскольку никто не упомянул об этом, проблема может быть решена путем добавления $parent
к связанному свойству
<div ng-controller="LoginController">
<input type="text" name="login" class="form-control" ng-model="$parent.ssn" ng-pattern="/\d{6,8}-\d{4}|\d{10,12}/" ng-required="true" />
<button class="button-big" type="submit" ng-click="BankLogin()" ng-disabled="!bankidForm.login.$valid">Logga in</button>
</div>
и контролером
app.controller("LoginController", ['$scope', function ($scope) {
$scope.ssn = '';
$scope.BankLogin = function () {
console.log($scope.ssn); // works!
};
}]);
У меня просто была эта проблема с использованием root_controller, привязанного к элементу body. Затем я использовал ng-view с угловым маршрутизатором. Проблема в том, что angular всегда создает новую область, когда вставляет html в элемент ng-view. Как следствие, моя функция "check" была определена в родительской области области, которая была изменена моим элементом ng-model.
чтобы решить проблему, просто используйте выделенный контроллер в загруженном по маршруту html-контенте.
вы можете сделать это, чтобы включить в поиск ng-keypress
Enter для ввода текста и в ng-click
для значок:
<input type="text" ng-model="searchText" ng-keypress="keyEnter(this,$event)" />
<button ng-click="check(searchText)">Check!</button>
in the controller
$scope.search = function (searchText) {
console.log(searchText);
}
$scope.keyEnter = function (serachText,$event) {
var keyCode = $event.which || $event.keyCode;
if (keyCode === 13) {//KeyCode for Enter key
console.log(searchText);
}
}
У меня была та же проблема.
Правильным способом было бы установить "searchText" как свойство внутри объекта.
но что, если я хочу оставить все как есть, строки? ну, я пробовал каждый метод, упомянутый здесь, ничего не сработало.
Но потом я заметил, что проблема только в инициации, поэтому я просто установил атрибут value, и он сработал.
<input type="text" ng-model="searchText" value={{searchText}} />
таким образом, значение просто устанавливается в '$scope.значение searchText и оно обновляется при изменении входного значения.
Я знаю, что это обходной путь, но это сработало для меня..
Я столкнулся с той же проблемой... Решение, которое сработало для меня, - использовать это ключевое слово..........
alert(это.Параметр modelname);