4

コード: http://plnkr.co/edit/xPZM5E7tjYqlt5NIabIu?p=preview line-no:17

このコードでは、ctrl.$modelValue = nVal;代わり に使用する$parse(attrs.ngModel).assign(scope, nVal);と機能しません。理由を指摘していただけますか?

angModule.directive('moChangeProxy', function ($parse) {
    return {
        require:'^ngModel',
        restrict:'A',
        link:function (scope, elm, attrs, ctrl) {
            var proxyExp = attrs.moChangeProxy;            
            scope.$watch(proxyExp, function (nVal) {
                if (nVal != ctrl.$modelValue) {
                    //ctrl.$modelValue = nVal;  // This does not work                  
                    $parse(attrs.ngModel).assign(scope, nVal); // This works well
                }
            });
            elm.bind('blur', function () {
                var proxyVal = scope.$eval(proxyExp);
                if(ctrl.$modelValue != proxyVal) {
                    scope.$apply(function(){
                        $parse(proxyExp).assign(scope, ctrl.$modelValue);
                    });
                }
            });
        }
    };
});
4

1 に答える 1

7

「機能しない」とは、変更が発生したときに、すべての $formatters のようなものを実行せず、$viewValue を更新しないことを意味していると思いますか?

もしそうなら、これは ngModelController が自身の $modelValue を監視するのではなく、「モデル式」の変更を監視するためです。

次の行を参照してください: https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1046-L1065

モデルを更新すると、ウォッチがトリガーされ、すべての機械が作動します。$modelValue の場合、ngModelController は変更を認識しません。

于 2013-01-25T13:11:17.083 に答える