Это мой HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Когда я набираю текст в поле, модель обновляется через механизм двусторонней привязки. Сладкий.
Однако, когда я делаю это через JQuery ...
$('#selectedDueDate').val(dateText);
Это не обновляет модель. Зачем?
Ответы:
Angular не знает об этом изменении. Для этого вам следует позвонить
$scope.$digest()
или внести изменения внутри$scope.$apply()
:См. Это, чтобы лучше понять грязную проверку
ОБНОВЛЕНИЕ : вот пример
источник
function
$ scope. $ Apply, передав функцию в качестве аргумента. И $ apply должен вызываться, когда вы вносите изменения в $ scope, то есть внутри onSelect. Ах, я ожидаю, что вы поместите манипуляции с DOM внутри контроллера только для примера, в реальном приложении это неправильно;)datepicker="scopeKeyThatYouWant"
вводомПросто используйте;
источник
trigger('input')
для этого датупикерonSelect
. Он правильно обновляет значение..val('something'
вызова в$apply
(или$digest
последующий вызов ) не работал.$('#selectedDueDate').val(dateText).trigger('change');
что мне не помогло..trigger('input');
работает как по волшебствуЯ обнаружил, что если вы не помещаете переменную непосредственно в область видимости, она обновляется более надежно.
Попробуйте использовать "dateObj.selectedDate" и в контроллере добавьте selectedDate в объект dateObj следующим образом:
Это сработало для меня.
источник
Попробуй это
источник
Просто запустите следующую строку в конце вашей функции:
$ scope. $ apply ()
источник
Что бы ни происходило за пределами Angular, Angular этого никогда не узнает.
Цикл дайджеста помещает изменения из модели -> контроллер, а затем из контроллера -> модель.
Если вам нужно увидеть последнюю модель, вам нужно запустить цикл дайджеста
Но есть вероятность, что цикл дайджеста продолжается, поэтому нам нужно проверить и запустить цикл.
Желательно всегда выполнять безопасное нанесение.
источник
AngularJS передает строку, числа и логические значения по значению, в то время как массивы и объекты передаются по ссылке. Таким образом, вы можете создать пустой объект и сделать дату свойством этого объекта. Таким образом angular обнаружит изменения модели.
В контроллере
В html
источник
Вы должны инициировать событие изменения входного элемента, потому что ng-model прослушивает входные события, и область видимости будет обновлена. Однако обычный триггер jQuery у меня не работал . Но вот что работает как шарм
Следующее не сработало
Вы можете узнать больше о создании и отправке синтетических событий .
источник
Я написал этот небольшой плагин для jQuery, который будет выполнять все вызовы для
.val(value)
обновления элемента angular, если он есть:Просто вставьте этот скрипт после jQuery и angular.js, и
val(value)
теперь обновления должны работать нормально .Минифицированная версия:
Пример:
Показать фрагмент кода
Этот ответ был дословно скопирован с моего ответа на другой аналогичный вопрос .
источник
Просто используйте:
вместо того:
источник