Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angular 1.2有效但版本1.3无效的对象类型ngModel值上使用$formatter_Javascript_Angularjs_Parsing_Angular Ngmodel - Fatal编程技术网

Javascript 在angular 1.2有效但版本1.3无效的对象类型ngModel值上使用$formatter

Javascript 在angular 1.2有效但版本1.3无效的对象类型ngModel值上使用$formatter,javascript,angularjs,parsing,angular-ngmodel,Javascript,Angularjs,Parsing,Angular Ngmodel,这段代码适用于angular-1.2.26,但不适用于angular-1.3.0.rc5(或我尝试过的任何1.3.x版本) 我在angular的github上发现了这个问题,但我不熟悉github接口,我无法确定错误是否已确认,或者行为是否符合预期,是否已修复;如果是,我应该采取什么版本 JSFiddles: 对于每一个,我希望在加载页面时输入“我的标签”。它适用于第一个,但不适用于第二个 并查看控制台以查看传递给格式化程序的值 HTML: <div ng-controller="

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

我在angular的github上发现了这个问题,但我不熟悉github接口,我无法确定错误是否已确认,或者行为是否符合预期,是否已修复;如果是,我应该采取什么版本

JSFiddles:

对于每一个,我希望在加载页面时输入“我的标签”。它适用于第一个,但不适用于第二个

并查看控制台以查看传递给格式化程序的值

HTML:

<div ng-controller="ctrl as c">
    <input my-dir ng-model="c.foobar" />
    <pre>{{c.foobar | json}}</pre>
</div>

在1.3中,您应该这样做(在1.2中也适用):

因为如果在1.3中取消移动
您的
$formatter
,那么您将获得模型的字符串化值,如果您想要访问模型的非字符串化值,则必须将
$formatter
放在末尾(
推送

我知道这与伊戈尔·米纳尔的观点相矛盾

最重要的变化是传递到格式化程序中的viewValue将 是格式化模型值的toString版本。如果有什么习俗的话 格式化程序在默认格式化程序之后执行,它们将看到字符串 值的版本。如果任何格式化程序需要访问该值 在字符串化之前,格式化程序应该通过 $formatters.unshift(customFormatter)

但是


因此,如果我理解(和rtfm),使用1.3,我应该推送格式化程序和解压解析器。我想我试过了,但可能不是r5版本的。。。无论如何,thx太多了。万岁,找到了解决办法,但这太违反直觉了。第一个格式化程序怎么能得到字符串化的对象,最后一个格式化程序怎么能得到实际的对象?!除非它们是以相反的方式执行的?是的,现在说‘函数是以相反的数组顺序调用的,每个函数都将值传递给下一个函数。’
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;
            })
        }
    }
})
.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;
            })
        }
    }
})