Ответ 1
Это желаемое поведение, вы должны определить модель в контроллере, а не в представлении.
<div ng-controller="Main">
<input type="text" ng-model="rootFolders">
</div>
function Main($scope) {
$scope.rootFolders = 'bob';
}
Использование AngularJS, если я установил значение простого текстового поля ввода для чего-то вроде "bob" ниже. Значение не отображается, если добавлен атрибут ng-model
.
<input type="text"
id="rootFolder"
ng-model="rootFolders"
disabled="disabled"
value="Bob"
size="40"/>
Кто-нибудь знает о простой работе, чтобы по умолчанию использовать этот вход, и сохранить ng-model
? Я попытался использовать ng-bind
со значением по умолчанию, но, похоже, тоже не работает.
Это желаемое поведение, вы должны определить модель в контроллере, а не в представлении.
<div ng-controller="Main">
<input type="text" ng-model="rootFolders">
</div>
function Main($scope) {
$scope.rootFolders = 'bob';
}
Vojta описал способ "Angular", но если вам действительно нужно сделать эту работу, @urbanek недавно опубликовал обходное решение, используя ng-init:
<input type="text" ng-model="rootFolders" ng-init="rootFolders='Bob'" value="Bob">
https://groups.google.com/d/msg/angular/Hn3eztNHFXw/wk3HyOl9fhcJ
Переключение директивы ввода, похоже, выполняет эту работу. Я внес некоторые незначительные изменения в код Dan Hunsaker:
$parse().assign()
для полей без атрибутов ngModel.assign()
.app.directive('input', function ($parse) {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, element, attrs) {
if (attrs.ngModel && attrs.value) {
$parse(attrs.ngModel).assign(scope, attrs.value);
}
}
};
});
Правильный способ Angular сделать это - написать одностраничное приложение AJAX в шаблоне формы, а затем динамически добавить его из модели. Модель не заполняется по умолчанию, потому что модель является единственным источником правды. Вместо этого Angular пойдет другим путем и попытается заполнить форму из модели.
Если у вас написано приложение, это может привести к довольно внушительным архитектурным изменениям. Если вы пытаетесь использовать Angular для улучшения существующей формы, а не для создания всего одностраничного приложения с нуля, вы можете вытащить значение из формы и сохранить его в области времени ссылки с помощью директивы. Angular затем привяжет значение в области назад к форме и сохранит ее в синхронизации.
Вы можете использовать относительно простую директиву, чтобы вытащить значение из формы и загрузить его в текущую область. Здесь я определил директиву initFromForm.
var myApp = angular.module("myApp", ['initFromForm']);
angular.module('initFromForm', [])
.directive("initFromForm", function ($parse) {
return {
link: function (scope, element, attrs) {
var attr = attrs.initFromForm || attrs.ngModel || element.attrs('name'),
val = attrs.value;
if (attrs.type === "number") {val = parseInt(val)}
$parse(attr).assign(scope, val);
}
};
});
Вы можете видеть, что я определил пару резервных копий, чтобы получить имя модели. Вы можете использовать эту директиву в сочетании с директивой ngModel или привязать к чему-то другому, кроме $scope, если хотите.
Используйте его следующим образом:
<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}
Обратите внимание, что это также будет работать с текстовыми полями и выберите выпадающие списки.
<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}
Обновление:. Мой первоначальный ответ заключался в том, что контроллер содержит DOM-код, который разбивает соглашения Angular в пользу HTML. @dmackerman упомянул директивы в комментарии к моему ответу, и я полностью пропустил это до сих пор. С этим вводом, здесь правильный способ сделать это, не нарушая Angular или HTML-соглашения:
Также есть способ получить оба - захватить значение элемента и использовать его для обновления модели в директиве:
<div ng-controller="Main">
<input type="text" id="rootFolder" ng-model="rootFolders" disabled="disabled" value="Bob" size="40" />
</div>
а затем:
app.directive('input', ['$parse', function ($parse) {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, element, attrs) {
if(attrs.value) {
$parse(attrs.ngModel).assign(scope, attrs.value);
}
}
};
}]);
Вы можете, конечно, изменить приведенную выше директиву, чтобы сделать больше с атрибутом value
, прежде чем устанавливать модель в ее значение, включая использование $parse(attrs.value, scope)
для обработки атрибута value
в качестве выражения Angular (хотя я ' d, возможно, для этого используется другой [пользовательский] атрибут, так что стандартные HTML-атрибуты последовательно рассматриваются как константы).
Кроме того, существует аналогичный вопрос в создании шаблонов данных, доступных в ng-model, которые также могут быть интересны.
Если вы используете директиву AngularJs ngModel, помните, что значение атрибута value
не привязывается к полю ngModel. Вы должны сами его инициализировать и лучший способ сделать это,
<input type="text"
id="rootFolder"
ng-init="rootFolders = 'Bob'"
ng-model="rootFolders"
disabled="disabled"
value="Bob"
size="40"/>
Это небольшая модификация предыдущих ответов...
Нет необходимости в $parse
angular.directive('input', [function () {
'use strict';
var directiveDefinitionObject = {
restrict: 'E',
require: '?ngModel',
link: function postLink(scope, iElement, iAttrs, ngModelController) {
if (iAttrs.value && ngModelController) {
ngModelController.$setViewValue(iAttrs.value);
}
}
};
return directiveDefinitionObject;
}]);
Привет, вы можете попробовать ниже методы с инициализацией модели.
Здесь вы можете инициализировать ng-модель текстового поля двумя способами
- с использованием ng-init
- с использованием $scope в js
<!doctype html>
<html >
<head>
<title>Angular js initalize with ng-init and scope</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
</head>
<body ng-app="app" >
<h3>Initialize value with ng-init</h3>
<!-- Initlialize model values with ng-init -->
<div ng-init="user={fullname:'Bhaskar Bhatt',email:'[email protected]',address:'Ahmedabad'};">
Name : <input type="text" ng-model="user.fullname" /><br/>
Email : <input type="text" ng-model="user.email" /><br/>
Address:<input type="text" ng-model="user.address" /><br/>
</div>
<!-- initialize with js controller scope -->
<h3>Initialize with js controller</h3>
<div ng-controller="alpha">
Age:<input type="text" name="age" ng-model="user.age" /><br/>
Experience : <input type="text" name="experience" ng-model="user.exp" /><br/>
Skills : <input type="text" name="skills" ng-model="user.skills" /><br/>
</div>
</body>
<script type="text/javascript">
angular.module("app",[])
.controller("alpha",function($scope){
$scope.user={};
$scope.user.age=27;
$scope.user.exp="4+ years";
$scope.user.skills="Php,javascript,Jquery,Ajax,Mysql";
});
</script>
</html>
Проблема в том, что вы должны установить ng-model в родительский элемент, где вы хотите установить значение ng-value/value. Как упоминалось Angular:
В основном он используется на входах [radio] и дополнительных элементах, поэтому, когда элемент выбран, ngModel этого элемента (или его родительский элемент выбора) устанавливается в значение границы.
Например: это выполненный код:
<div class="col-xs-12 select-checkbox" >
<label style="width: 18em;" ng-model="vm.settingsObj.MarketPeers">
<input name="radioClick" type="radio" ng-click="vm.setPeerGrp('market');"
ng-value="vm.settingsObj.MarketPeers"
style="position:absolute;margin-left: 9px;">
<div style="margin-left: 35px;color: #717171e8;border-bottom: 0.5px solid #e2e2e2;padding-bottom: 2%;">Hello World</div>
</label>
</div>
Примечание. В этом случае я получил ответ JSON на ng-модель и значение, я просто добавляю другое свойство к объекту JS как "MarketPeers". Таким образом, модель и значение могут зависеть в зависимости от необходимости, но я думаю, что этот процесс поможет, чтобы иметь как ng-модель, так и значение, но не иметь их в одном элементе.