我遇到了查看java脚本对象属性的问题。部分我描述了这个问题here,但我没有得到解决方案......
我将以另一种方式描述问题。这是fiddle
以下是我的指令代码:
var myApp = angular.module('myApp', []);
var ctrl = function($scope) {
$scope.amount = '0.00';
$scope.values = {
amount: 0.00
};
};
myApp.directive('currency', function($filter) {
return {
restrict: "A",
require: "ngModel",
scope: {
separator: "=",
fractionSize: "=",
ngModel: "="
},
link: function(scope, element, attrs) {
if (typeof attrs.separator === 'undefined' ||
attrs.separator === 'point') {
scope.separator = ".";
} else {
scope.separator = ",";
};
if (typeof attrs.fractionSize === 'undefined') {
scope.fractionSize = "2";
};
scope[attrs.ngModel] = "0" + scope.separator;
for(var i = 0; i < scope.fractionSize; i++) {
scope[attrs.ngModel] += "0";
};
scope.$watch(attrs.ngModel, function(newValue, oldValue) {
if (newValue === oldValue) {
return;
};
var pattern = /^\s*(\-|\+)?(\d*[\.,])$/;
if (pattern.test(newValue)) {
scope[attrs.ngModel] += "00";
return;
};
}, true);
}
};
});
这是我的HTML布局:
<div ng-app="myApp">
<div ng-controller="ctrl">
{{amount}}<br>
<input type="text" style="text-align: right;" ng-model="amount" currency separator="point" fraction-size="2"></input>
</div>
</div>
我想将输入元素中的值绑定到外部控制器中的values.amount
项,但是我的指令的watch指令不起作用...
我想要实现的逻辑如下:如果用户提出一个点,我想在输入元素中添加额外的零。我的意思是如果输入元素中的值说“42”并且用户给它一个点,那么现在的值是“42”。然后两个额外的零必须像这样“42.00”。
如果我使用ng-model="amount"
将输入元素的数据绑定到外部控制器中的变量,则输入元素中的逻辑可以工作,但外部控制器的数值不会更新。
如果我使用ng-model="values.amount"
进行绑定,那么外部控制器的value.amount和输入元素逻辑都不起作用。
实际上我必须使用values.amount
指令将输入元素绑定到ng-model="values.amount"
,但它不起作用,我不知道为什么。
有人可以帮我解决这个问题吗?有什么想法或建议吗?
答案 0 :(得分:0)
由于表达式
,这不起作用scope[attrs.ngModel] = ...
在amount
案例中,这只是分配给scope.amount
。但是在values.amount
这不会分配给scope.values.amount
,而是指定范围的“values.amount
”属性。
您可以使用$parse
服务,而不是以这种方式分配。
var parsed = $parse(attrs.ngModel); // Parse expression
var currentValue = parsed(scope); // Evaluate expression
parsed.assign(scope, 'newvalue'); // Assign expression
这应该可以解决您的问题,但是您可能希望将此解析器和格式化程序用作更好的方法。您可以使用解析器和格式化程序来控制转换,而不是自己解释模型的值,您可以通过 required 的ngModel
控制器查看和更新它。
答案 1 :(得分:0)
我试过解决你的问题,就是这样:
1)删除你的指令范围
2)将ngModel添加到链接功能中
3)删除你的代码的这部分(不需要)
scope[attrs.ngModel] = "0" + scope.separator;
for(var i = 0; i < scope.fractionSize; i++) {
scope[attrs.ngModel] += "0";
};
并将 $ watch 替换为
ngModel.$parsers.unshift(function(viewValue) {
var pattern = /^\s*(\-|\+)?(\d*[\.,])$/;
if (pattern.test(viewValue)) {
viewValue += "00";
};
element.val(viewValue); // set element view value
return viewValue; // set new model value
});
我试试这个并且工作正常。
jsFiddle demo
欢呼声