Возможно глупый вопрос, но у меня есть 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 = {};
объект в контроллере и вуаля ... Понятия не имею, почему это работает хотя ;]
javascript
angularjs
data-binding
angular-ngmodel
alchemication
источник
источник
searchText
наsearch.text
, любая идея почему ??voila
, а неvuala
,wolla
и т. Д.Ответы:
Контроллер как версия (рекомендуется)
Вот шаблон
JS
Пример: http://codepen.io/Damax/pen/rjawoO
Лучше всего будет использовать компонент с Angular 2.x или Angular 1.5 или выше
########Старый способ (НЕ рекомендуется)
Это НЕ рекомендуется, потому что строка является примитивной, настоятельно рекомендуется использовать объект вместо
Попробуйте это в вашей разметке
и это в вашем контроллере
источник
searchText
?«Если вы используете ng-модель, у вас должна быть точка».
Сделайте так, чтобы ваша модель указывала на object.property, и вам будет хорошо.
контроллер
шаблон
Это происходит, когда дочерние области находятся в игре - как дочерние маршруты или ng-повторы. Дочерняя область создает свое собственное значение, и возникает конфликт имен, как показано здесь :
Подробнее об этом видео: https://www.youtube.com/watch?v=SBwoFkRjZvE&t=3m15s.
источник
В книге «Освоение разработки веб-приложений с помощью AngularJS» с.19 написано, что
Области действия - это просто объекты JavaScript, и они имитируют иерархию DOM. Согласно JavaScript Prototype Inheritance , свойства областей разделяются через области. Чтобы избежать этого, точечные обозначения следует использовать для привязки ng-моделей.
источник
Использование
this
вместо$scope
работ.Редактировать: во время написания этого ответа у меня была гораздо более сложная ситуация, чем эта. После комментариев я попытался воспроизвести его, чтобы понять, почему он работает, но не повезло. Я думаю, что каким-то образом (не знаю почему) генерируется новая дочерняя область, которая
this
ссылается на эту область. Но если$scope
он используется, он на самом деле ссылается на родительский $ scope из-за функции лексической области видимости javascript .Было бы здорово, если бы кто-то, имеющий эту проблему, проверил этот способ и сообщил нам.
источник
$scope
создают новую область (то есть в функцииcheck()
,this
ссылаются на область, которая является дочерней областью$scope
). Почему это так? Можете ли вы дать некоторые объяснения?this.searchText = "something else"
или даже если$scope.searchText = "something else"
, это не обновляет представление. Вы можете объяснить эту проблему?У меня была та же проблема, и это было из-за того, что я сначала не объявил пустой объект в верхней части моего контроллера:
Надеюсь, это будет работать для вас!
источник
Я столкнулся с той же проблемой, когда имел дело с нетривиальным представлением (есть вложенные области видимости). И наконец обнаружил, что это известная хитрая вещь при разработке приложения AngularJS из-за природы наследования java-скриптов на основе прототипов. Вложенные области AngularJS создаются с помощью этого механизма. И значение, созданное из ng-модели, помещается в дочернюю область, не говоря, что родительская область (может быть, введенная в контроллер) не увидит значение, значение также будет затенять любое свойство с таким же именем, определенное в родительской области, если не использовать точку для обеспечения доступа к прототипу ссылки. Для получения более подробной информации просмотрите онлайн-видео, посвященное этой проблеме, http://egghead.io/video/angularjs-the-dot/ и комментарии по нему.
источник
Посмотрите на эту скрипку http://jsfiddle.net/ganarajpr/MSjqL/
Я (я предполагаю!) Сделал именно то, что вы делали, и, похоже, работает. Можете ли вы проверить, что здесь не работает для вас?
источник
Поскольку никто не упомянул об этом, проблему можно решить, добавив
$parent
к связанному свойствуИ контроллер
источник
Для меня проблема была решена путем складирования моих данных в объект (здесь "данные").
Надеюсь, это поможет
источник
У меня только что была эта проблема с использованием root_controller, привязанного к элементу body. Тогда я использовал ng-view с угловым роутером. Проблема в том, что angular ВСЕГДА создает новую область видимости при вставке html в элемент ng-view. Как следствие, моя функция «check» была определена в родительской области видимости, которая была изменена моим элементом ng-model.
Чтобы решить проблему, просто используйте выделенный контроллер в загруженном по маршруту HTML-содержимом.
источник
Вы можете сделать это, чтобы включить поиск по
ng-keypress
вводу для ввода текста иng-click
по значку:источник
У меня такая же проблема.
Правильным способом было бы установить searchText как свойство внутри объекта.
Но что, если я захочу оставить строку как есть? ну, я попробовал каждый упомянутый здесь метод, ничего не получалось.
Но потом я заметил, что проблема только в инициации, поэтому я просто установил атрибут значения, и это сработало.
Таким образом, значение просто устанавливается в значение «$ scope.searchText», и оно обновляется при изменении входного значения.
Я знаю, что это обходной путь, но он работал для меня ..
источник
Я столкнулся с той же проблемой ... Решение, которое работало для меня, это использовать это ключевое слово ..........
оповещения (this.ModelName);
источник