Это распространенная ошибка в новых приложениях Angular. Вы не хотите записывать свои значения в свой HTML на сервере, если можете этого избежать. На самом деле, тем лучше, если вам удастся отказаться от того, чтобы ваш сервер полностью отображал HTML.
В идеале вы хотите отправить свои шаблоны HTML Angular, а затем извлечь свои значения через $ http в JSON и поместить их в свою область видимости.
Итак, если возможно, сделайте следующее:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Если вы ОБЯЗАТЕЛЬНО ДОЛЖНЫ отображать свои значения в HTML со своего сервера, вы можете поместить их в глобальную переменную и получить к ним доступ с помощью $ window:
В заголовке своей страницы вы должны написать:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
И тогда в вашем контроллере вы получите это так:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
Надеюсь, это поможет.
Если вы не можете переработать свое приложение, чтобы оно выполняло то, что предлагает @blesh (вытащить данные JSON с помощью $ http или $ resource и заполнить $ scope), вы можете вместо этого использовать ng-init :
См. Также AngularJS - Атрибут Value в текстовом поле ввода игнорируется, когда используется ng-модель?
источник
ng-init
очень полезно при установке значений из кода программной части / обратной передачи, например<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. Немного некрасиво? Да, но помогает решить проблему с интеграцией.Это явно недостающее, но легко добавляемое исправление для AngularJS. Просто напишите короткую директиву, чтобы установить значение модели из поля ввода.
Вот моя версия:
источник
controller
для своей директивы и почему не использовалиlink
метод ?. Я новичок в angularjsval = $attrs.ngInitial || $attrs.value || $element.val()
на, чтобы он работал с выбранными элементами.ИМХО лучшим решением является директива @Kevin Stone, но мне пришлось обновить ее, чтобы она работала в любых условиях (например, select, textarea), и это точно работает:
источник
Вы можете использовать настраиваемую директиву (с поддержкой textarea, select, radio и checkbox), проверьте это сообщение в блоге https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- поля-атрибуты / .
источник
Вы также можете использовать в своем HTML-коде:
ng-init="card.description = 12345"
Это не рекомендуется Angular, и, как упоминалось выше, вы должны использовать исключительно свой контроллер.
Но работает :)
источник
У меня простой подход, потому что в моих формах есть тяжелые проверки и маски. Итак, я использовал jquery, чтобы снова получить свое значение и запустить событие «изменение» для проверки:
источник
Как указывали другие, инициализация данных в представлениях не является хорошей практикой. Однако рекомендуется инициализировать данные на контроллерах. (см. http://docs.angularjs.org/guide/controller )
Так что вы можете написать
и
Таким образом, представления не содержат данных, и контроллер инициализирует значение во время загрузки реальных значений.
источник
Если вам нравится подход Кевина Стоуна выше https://stackoverflow.com/a/17823590/584761, рассмотрите более простой подход, написав директивы для определенных тегов, таких как 'input'.
Если вы пойдете по этому пути, вам не придется беспокоиться о добавлении ng-initial к каждому тегу. Он автоматически устанавливает значение модели для атрибута значения тега. Если вы не установите атрибут значения, по умолчанию будет пустая строка.
источник
Вот подход, ориентированный на сервер:
Это та же основная идея, что и в более популярных ответах на этот вопрос, за исключением того, что $ provide.value регистрирует службу, которая содержит ваши значения по умолчанию.
Итак, на сервере у вас может быть что-то вроде:
И разместите его на своей странице с помощью выбранной вами серверной технологии. Вот суть: https://gist.github.com/exclsr/c8c391d16319b2d31a43
источник
Это более общая версия идей, упомянутых выше ... Он просто проверяет, есть ли какое-либо значение в модели, а если нет, он устанавливает значение для модели.
JS:
HTML (пример использования):
источник
$scope
к вызовуgetter()
- надеюсь, это проясняет ситуацию для всех, кто пытается это сделать!Я попробовал то, что предложил @Mark Rajcok. Он работает со строковыми значениями (Visa-4242). Пожалуйста, обратитесь к этой скрипке .
Со скрипки:
То же, что и в скрипте, можно сделать и с помощью
ng-repeat
, что можно порекомендовать. Но после прочтения ответа @Mark Rajcok я просто хотел попробовать то же самое для формы с массивом профилей. Все работает хорошо, пока у меня не будет $ scope.profiles = [{}, {}]; код в контроллере. Если я удалю этот код, я получаю ошибки. Но в обычных сценариях я не могу печатать,$scope.profiles = [{},{}];
поскольку я печатаю или отображаю html с сервера. Можно ли будет выполнить вышеизложенное аналогично тому, как это сделал @Mark Rajcok для строковых значений, например<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, без необходимости повторять часть JavaScript с сервера.источник
Только что добавлена поддержка выбора элемента в "исправить" Райана Монтгомери.
});
источник
Если у вас есть значение init в URL-адресе, например
mypage/id
, в контроллере angular JS вы можете использовать его,location.pathname
чтобы найти идентификатор и назначить его нужной модели.источник