角度ng模型不同的视图和价值
Angular ngModel different view and value
指令中的ngModel控制器是否有任何选项可以在视图中显示与ngModel值不同的内容,或者我必须编写自定义html指令进行输入?
我写了一个逗号分隔符指令。一切都很好,但是ngModel值从数字更改为带有,
的字符串。
我的意思是我可以有值1000000
的输入,但它在视图中显示1,000,000
?
更新:
在输入框中显示1,000,000
,但其值为1000000
。
更新 2
我知道$formatters
和$parsers
.但问题是$formatters
不会损害实际价值,但是当ngModel直接更改时,它起作用,而不是通过输入输入元素,并且$parsers
监视所有更改,但也更改实际值。
使用过滤器来实现这一点
.HTML
<div ng-controller="demoController">
<input type="text" value="{{val | number}}">
</div>
控制器:
var app = angular.module('demoApp', []);
app.controller('demoController', ['$scope', '$http', function($scope, $http, $cookies, $location){
$scope.val = 1000000;
}]);
ngModel.$formatters
:
ngModel.$formatters.push(function (number) {
return convertToCommaSeparatedString(number);
});
在这种情况下,模型将保持数字,但输入将显示格式化的字符串。
请参阅文档
回答你的问题...
"我的意思是,我可以输入值为 1000000 的输入,但它在视图中显示 1,000,000 吗?"
我假设您想要一个数字作为模型,但在用户键入时输入中用逗号分隔字符串。基于这个假设,我可以用"是"来回答你的问题,你可以这样做;方法如下...
链接: 代码笔工作示例
注意
此示例的创建方式只允许在输入中输入数字。您可以在每个$filter中根据需要更改此设置。
另外,请注意,仅使用您创建的筛选器,以便在数据进入筛选器时清理数据。角度过滤器主要用于静态值,因此当您想要在输入值时对其进行过滤时,它们不起作用。
即在这种情况下,如果我们没有通过删除 (/''D/g) 所有非数字来清理数据,我们将在字符串中使用逗号(和其他任何内容)进行拆分、连接和反转,结果会崩溃。
.HTML
<div ng-app="myApp" ng-controller="myCtrl">
<input ng-model="inputValueModel" type="text" format-my-view-only />
Model Value is Number: {{ inputValueModel || "Empty" }}
</div>
.JS
var app = angular.module("myApp", []).controller("myCtrl", function($scope){});
app.directive("formatMyViewOnly", function($filter){
// You don't have to use $filter, you can do inline work as well as
// functions inside of this directive. I use $filters for code reuse.
return {
require: "ngModel",
restrict: "A",
link: function(scope, elem, attrs, input){
input.$parsers.push(function(value){
value = $filter("addCommas")(value);
input.$setViewValue(value); // Set view value.
input.$render();
// Then return Number to model.
return +$filter("onlyNumbers")(value); // Unary Operator converts string to Number. Remove it if you want model to be a string as well.
});
} // end link.
}; // end return.
});
app.filter('onlyNumbers', function(){
return function(numbers){
if(invalid(numbers)){ return ""; }
return numbers.replace(/'D/g, "");
};
function invalid(number){
return !number || notString(number) || noNumbersExists(number);
}
function notString(string){
return typeof string != "string";
}
function noNumbersExists(number){
return number.replace(/'D/g, "").length === 0;
}
});
app.filter('addCommas', function(){
return function(stringOfNums){
if(invalid(stringOfNums)){ return ""; }
return commaSeparated(stringOfNums.replace(/'D/g, ""));
};
function commaSeparated(numbers){
if(!numbers){return "";}
return numbers.split("").reverse().join("")
.match(/.{1,3}/g).reverse().join(",");
}
function invalid(number){
return !number || notString(number) || noNumbersExists(number);
}
function notString(string){
return typeof string != "string";
}
function noNumbersExists(number){
return number.replace(/'D/g, "").length === 0;
}
});
- 正在使用$location.path(.)路由ng视图
- ng视图外的链接重定向到ng视图内的页面
- 如何在AngularJS视图中使用promise(ng-show)
- 如何应用带过滤器的ng if来过滤记录,并在同一页面中显示两个不同的视图
- 带有粘性标题的角度ng视图不起作用
- 当在ng视图中加载新路由时,Tabbing(tabindex)针对错误的元素
- NG-单击不触发,深入 UI 视图
- 如何在 ng-repeat 中使用 anchorScroll() 以在索引 x 处具有开始视图
- 更改ng包含或定义默认ui视图
- 停止Angular JS ng视图擦除页面
- ng单击需要两次才能更新视图
- 如何在ng视图中进行页面渲染后的平滑滚动
- angularjs-ng视图重新排列html元素
- Angular 1.3+ui路由器+生成器ng poly嵌入嵌套(?)视图不起作用
- AngularJS视图没有'当ng模型值发生变化时,t更新
- ng使用ui视图制作动画
- 如果未找到或未在ng视图外工作,则为ng
- 控制器内部的scope函数不根据视图中的ng模型更新值
- 如何使用视图ng-model的不同参数再次运行控制器功能
- 当使用两个不同的控制器文件时,局部视图ng-click不起作用