在对象类型为ngModel的值上使用$ formatter,角度为1.2,但不是1.3版本

M's*_*ph' 4 javascript parsing angularjs angular-ngmodel

这段代码适用于angular-1.2.26,但不适用于angular-1.3.0.rc5(或我试过的任何1.3.x版本).

我在angular的github上发现了这个问题https://github.com/angular/angular.js/issues/9218,但是我不熟悉github接口,我无法弄清楚bug是否被确认或是否有预期的行为,如果它已被修复; 如果是,我应该采取什么版本.

JSFiddles:

对于每一个,我希望在加载页面时在输入中有"我的标签".它适用于第一个,但不适用于第二个.

然后查看控制台以查看传递给formatter的值.

HTML:

<div ng-controller="ctrl as c">
    <input my-dir ng-model="c.foobar" />
    <pre>{{c.foobar | json}}</pre>
</div>
Run Code Online (Sandbox Code Playgroud)

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;
            })
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

Jos*_*sep 11

在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;
            })
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

因为如果unshift您$formatter在1.3中,那么您将获得模型的字符串化值,如果您想要访问模型的非字符串化值,则必须将您$formatter放在最后(push).

我知道这与Igor Minar的评论相矛盾.

重大变化是传递给格式化程序的viewValue将是格式化modelValue的toString版本.因此,如果任何自定义格式化程序在默认格式化程序之后执行,它们将看到该值的字符串版本.如果任何格式化程序在字符串化之前需要访问该值,则应通过$ formatters.unshift(customFormatter)注册格式化程序.

但在评论之后事情发生了变化.

例