Angularjs 默认值的角度js初始ng模型
假设您有一个表单,其中包含从数据库加载的值。如何初始化ng模型 例如:Angularjs 默认值的角度js初始ng模型,angularjs,Angularjs,假设您有一个表单,其中包含从数据库加载的值。如何初始化ng模型 例如: <input name="card[description]" ng-model="card.description" value="Visa-4242"> 这是新角度应用中的常见错误。如果可以避免的话,您不希望将值写入服务器上的HTML中。如果事实上,如果你能摆脱让你的服务器完全呈现HTML,那就更好了 理想情况下,您希望发送您的Angular HTML模板,然后通过JSON中的$http下拉您的值并将它们放
<input name="card[description]" ng-model="card.description" value="Visa-4242">
这是新角度应用中的常见错误。如果可以避免的话,您不希望将值写入服务器上的HTML中。如果事实上,如果你能摆脱让你的服务器完全呈现HTML,那就更好了 理想情况下,您希望发送您的Angular HTML模板,然后通过JSON中的$http下拉您的值并将它们放入您的范围中 因此,如果可能,请执行以下操作:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
我希望这会有所帮助。如果你不能按照@blesh的建议重新编写你的应用程序(使用$http或$resource向下拉JSON数据并填充$scope),你可以使用以下替代方法:
另请参见我尝试了@Mark Rajcok的建议。它适用于字符串值(Visa-4242)。 请参考这个 从小提琴上: 使用
ng repeat
,大家都可以推荐在小提琴上做同样的事情。但是在阅读了@Mark Rajcok给出的答案之后,我只想对一个具有配置文件数组的表单进行同样的尝试。
在我拥有$scope.profiles=[{},{}]之前,一切都很顺利;控制器中的代码。如果我删除这个代码,我会得到错误。
但在正常情况下,我无法打印$scope.profiles=[{},{}]代码>当我从服务器打印或回显html时。
是否可以像@Mark Rajcok对字符串值(如
)所做的那样执行上述操作,而不必从服务器回显JavaScript部分。这显然是AngularJS缺少的,但很容易添加的修复程序。只需编写一个快速指令,从输入字段设置模型值
<input name="card[description]" value="Visa-4242" ng-model="card.description" ng-initial>
刚刚在Ryan Montgomery的“修复”中添加了对select元素的支持
500多
在250到500之间
在100到250之间
在50到100之间
20到50岁之间
少于20
应用指令('ngInitial',函数(){
返回{
限制:“A”,
控制器:['$scope','$element','$attrs','$parse',函数($scope,$element,$attrs,$parse){
val=$attrs.sbInitial | |$attrs.value | |$element.val()| |$element.text()
getter=$parse($attrs.ngModel)
setter=getter.assign
setter($scope,val)
}]
}
})) IMHO最好的解决方案是@Kevin Stone指令,但我必须升级它,使其在各种条件下都能工作(如select、textarea),而这一个确实有效:
angular.module('app').directive('ngInitial', function($parse) {
return {
restrict: "A",
compile: function($element, $attrs) {
var initialValue = $attrs.value || $element.val();
return {
pre: function($scope, $element, $attrs) {
$parse($attrs.ngModel).assign($scope, initialValue);
}
}
}
}
});
正如其他人指出的,在视图上初始化数据不是一个好的做法。
但是,建议在控制器上初始化数据。(见附件)
这样你就可以写作了
<input name="card[description]" ng-model="card.description">
这样,视图不包含数据,控制器在加载实际值时初始化值。如果您喜欢上面Kevin Stone的方法
考虑编写一个更简单的方法来为特定的标签编写指令,例如“输入”。p>
app.directive('input', function ($parse) {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, element, attrs) {
if (attrs.ngModel) {
val = attrs.value || element.text();
$parse(attrs.ngModel).assign(scope, val);
}
}
}; });
如果你走这条路线,你就不必担心在每个标签上都添加ng首字母。它会自动将模型的值设置为标记的“值”属性。如果不设置value属性,它将默认为空字符串。如果URL中有init值,如mypage/id
,则在angular JS的控制器中,可以使用location.pathname
查找id并将其分配给所需的模型。以下是一种以服务器为中心的方法:
<html ng-app="project">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script>
// Create your module
var dependencies = [];
var app = angular.module('project', dependencies);
// Create a 'defaults' service
app.value("defaults", /* your server-side JSON here */);
// Create a controller that uses the service
app.controller('PageController', function(defaults, $scope) {
// Populate your model with the service
$scope.card = defaults;
});
</script>
<body>
<div ng-controller="PageController">
<!-- Bind with the standard ng-model approach -->
<input type="text" ng-model="card.description">
</div>
</body>
</html>
并通过您选择的服务器端技术将其放入您的页面。这里有一个要点:您也可以在HTML代码中使用:
ng init=“card.description=12345”
Angular公司不推荐使用该控制器,如上所述,您应专门使用控制器
但它是有效的:)您可以使用自定义指令(支持文本区域、选择、广播和复选框),查看这篇博文。这是上述想法的更通用版本。。。
它只是检查模型中是否有任何值,如果没有,则将值设置为模型
JS:
HTML(用法示例):
我有一个简单的方法,因为我的表单中有一些繁重的验证和掩码。因此,我使用jquery再次获取我的值,并触发事件“change”进行验证:
$('#myidelement').val('123');
$('#myidelement').trigger( "change");
是的,这很有帮助。我想我只是对那些棱角分明的家伙做出这个决定感到震惊。不要感到震惊。。。HTML的呈现正在从服务器转移到浏览器。现在JavaScript中有几十个MVC框架,对于服务器来说,仅仅将JSON/XML数据托管到JavaScript应用程序比呈现服务器上的每个页面要高效得多。它将大量工作转移到客户机上,而不是让服务器承担。更不用说它节省了带宽。最重要的是,您可以有一个本地移动应用程序(或任何真正的应用程序),通过HTTP使用相同的JSON。这就是未来。@blesh:回答得很好。谢谢。我同意这是前进的方向,我自己也已经开始采用这种方法;您是否有任何支持此声明的链接?我还担心,将html的呈现从服务器移动到客户端可能会导致页面加载时间变慢,特别是在移动设备中,您可能会呈现大量html,例如导航树。我不认为这是一个“错误”。在某些情况下,客户端呈现是最好的解决方案。在其他情况下,服务器端渲染是一种方法。这两种技术都可以使用角度渲染,客户端渲染不应该被认为是“角度方式”,因为它不是。角度比那更灵活。@blesh,当然,在任何情况下,搜索引擎优化是重要的,但爬虫程序替代内容的成本高于使用嵌入式数据实现angular的成本——任何对感知速度或用户体验呈现时间具有极高价值的应用程序——许多内容网站和电子商务网站都会属于其中之一类别。t的工程师们
<select class="input-control" ng-model="regCompModel.numberOfEmployeeId" ng-initial>
<option value="1af38656-a752-4a98-a827-004a0767a52d"> More than 500</option>
<option value="233a2783-db42-4fdb-b191-0f97d2d9fd43"> Between 250 and 500</option>
<option value="2bab0669-550c-4555-ae9f-1fdafdb872e5"> Between 100 and 250</option>
<option value="d471e43b-196c-46e0-9b32-21e24e5469b4"> Between 50 and 100</option>
<option value="ccdad63f-69be-449f-8b2c-25f844dd19c1"> Between 20 and 50</option>
<option value="e00637a2-e3e8-4883-9e11-94e58af6e4b7" selected> Less then 20</option>
</select>
app.directive('ngInitial', function () {
return {
restrict: 'A',
controller: ['$scope', '$element', '$attrs', '$parse', function ($scope, $element, $attrs, $parse) {
val = $attrs.sbInitial || $attrs.value || $element.val() || $element.text()
getter = $parse($attrs.ngModel)
setter = getter.assign
setter($scope, val)
}]
}
angular.module('app').directive('ngInitial', function($parse) {
return {
restrict: "A",
compile: function($element, $attrs) {
var initialValue = $attrs.value || $element.val();
return {
pre: function($scope, $element, $attrs) {
$parse($attrs.ngModel).assign($scope, initialValue);
}
}
}
}
});
<input name="card[description]" ng-model="card.description">
$scope.card = { description: 'Visa-4242' };
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
app.directive('input', function ($parse) {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, element, attrs) {
if (attrs.ngModel) {
val = attrs.value || element.text();
$parse(attrs.ngModel).assign(scope, val);
}
}
}; });
<html ng-app="project">
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script>
// Create your module
var dependencies = [];
var app = angular.module('project', dependencies);
// Create a 'defaults' service
app.value("defaults", /* your server-side JSON here */);
// Create a controller that uses the service
app.controller('PageController', function(defaults, $scope) {
// Populate your model with the service
$scope.card = defaults;
});
</script>
<body>
<div ng-controller="PageController">
<!-- Bind with the standard ng-model approach -->
<input type="text" ng-model="card.description">
</div>
</body>
</html>
{
description: "Visa-4242"
}
function defaultValueDirective() {
return {
restrict: 'A',
controller: [
'$scope', '$attrs', '$parse',
function ($scope, $attrs, $parse) {
var getter = $parse($attrs.ngModel);
var setter = getter.assign;
var value = getter();
if (value === undefined || value === null) {
var defaultValueGetter = $parse($attrs.defaultValue);
setter($scope, defaultValueGetter());
}
}
]
}
}
<select class="form-control"
ng-options="v for (i, v) in compressionMethods"
ng-model="action.parameters.Method"
default-value="'LZMA2'"></select>
$('#myidelement').val('123');
$('#myidelement').trigger( "change");