对类型为ngModel的对象使用$formatter,角度为1.2,但版本为1.3
Use a $formatter on a object typed ngModel value with angular 1.2 worked, but not with version 1.3
此代码适用于angular-1.2.26,但不适用于angular 1.3.0.rc5(或我尝试过的任何1.3.x版本)。
我发现了这个问题https://github.com/angular/angular.js/issues/9218在angular的github上,但我不熟悉github接口,我不知道这个错误是否被确认,或者行为是否是预期的,是否已经修复;如果是,我应该选择什么版本。
JSFiddles:
- angular v1.2.26,ngModel为对象
- angular v1.3..rc5,ngModel为对象
对于每一个,我希望在加载页面时在输入中都有"我的标签"。它适用于第一个,但不适用于第二个。
然后查看控制台,查看传递给格式化程序的值。
HTML:
<div ng-controller="ctrl as c">
<input my-dir ng-model="c.foobar" />
<pre>{{c.foobar | json}}</pre>
</div>
JS:
var app = angular.module('app', []);
app.controller('ctrl', function(){
this.foobar = {
value : 'my value',
label : 'my label'
}
})
.directive('myDir', function(){
return {
restrict :'A',
require:'ngModel',
link : function(scope, elt, attrs, modelCtrl){
// conversion "view -> model"
modelCtrl.$parsers.unshift( function(value){
console.log('Value:', value);
return {label:value, value:value};
})
// conversion "model -> view"
modelCtrl.$formatters.unshift(function formatter(modelValue){
console.log('modelValue:', modelValue);
return modelValue.label;
})
}
}
})
在1.3中,您应该这样做(这在1.2中也适用):
.directive('myDir', function(){
return {
restrict :'A',
require:'ngModel',
link : function(scope, elt, attrs, modelCtrl){
// conversion "view -> model"
modelCtrl.$parsers.push( function(value){
console.log('Value:', value);
return {label:value, value:value};
})
// conversion "model -> view"
modelCtrl.$formatters.push(function formatter(modelValue){
console.log('modelValue:', modelValue);
return modelValue.label;
})
}
}
})
因为如果你在1.3中unshift
你的$formatter
,那么你会得到模型的字符串值,如果你想访问模型的非字符串值,你必须把$formatter
放在最后(push
)。
我知道这与伊戈尔·米纳尔的评论相矛盾。
突破性的变化是,传递到格式化程序中的viewValue将是格式化的modelValue的toString版本。所以,如果有任何习俗格式化程序在默认格式化程序之后执行,它们将看到字符串值的版本。如果任何格式化程序需要访问该值在字符串化之前,格式化程序应该通过$formatters.unshift(customFormatter).
但在那条评论之后,情况发生了变化。
示例
相关文章:
- JS编译器/包管理器,用于版本控制
- jQuery-2.1.1.min.js或最新版本jQuery-2.13.min.js不会't支持'@
- Chrome加载旧版本的Javascript文件
- 如何使用js将SNAPSHOT内部版本号转换为3位数的整数
- 为什么jQuery 1.8不能在IE8和InternetExplorer9中使用?(截至2012年9月的IE9最新版本)
- 如何设置jsfiddle's的javascript版本
- 如何将ngrepeat下的ngmodel绑定到$scope
- 同一HTML页面中的两个不同版本的JQuery
- YouTube作为弹出窗口在桌面版本上播放,但不在移动设备上播放
- 有没有一种方法可以获得three.js的最小/lite版本
- Node和Nodejs版本不同
- 以ECMAScript 5及更高版本为目标时,八进制文字不可用
- 如何在HTML中指定Javascript的版本
- 注册组件的非角度和角度版本
- 如何使用javascript将textbox的值赋给ngModel textbox
- 浏览器是否持久缓存脚本元素的编译版本
- 如何确定相对较新版本的IE的高度和宽度(IE8不喜欢从JavaScript设置这种样式吗?
- 如何在IE8及以前版本中处理mousemove
- 对类型为ngModel的对象使用$formatter,角度为1.2,但版本为1.3
- 角度2误差-没有指示“;exportAs”;设置为“;ngModel”;带有RC4版本