5

ngModel を必要とし、フォーマッターとパーサーを追加して値を操作するディレクティブを作成しています。それはうまく機能しますが、操作は $watch する必要がある外部データに依存するため、この時計からモデル値を更新する方法を探しています。呼び出してみました$setViewValueが、何も起こりません ($viewValue が変更されていないため??)。

次の簡単な例では、「factor」を変更してもモデル値は更新されません。

angular.module('app', []).directive('multiply', multiplyDirective);

function multiplyDirective() {
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            factor: '=multiply'
        },
        link: function(scope, elem, attr, ngModel) {

            ngModel.$formatters.push(function (value) {
                return value / scope.factor;
            });

            ngModel.$parsers.push(function (value) {
                return value * scope.factor;
            });

            scope.$watch('factor', function () {
               // how to run the parsers pipeline to update modelvalue?
               ngModel.$setViewValue(ngModel.$viewValue);
            });
        }
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js"></script>


<body ng-app ng-init="factor = 1; value = 1">
  <input type="number" ng-model="value" multiply="factor" /> x
  <input type="number" ng-model="factor" />
  = {{ value }}
</body>

編集:内部$$parseAndValidateメソッドを呼び出すと機能しますが、更新を強制するパブリック API があるかどうかは疑問です。

ngModel.$setViewValue(ngModel.$viewValue);編集: の動作が で変更されたことがわかりました1.3.01.2.xコードを使用するとうまくいきます!

4

3 に答える 3

0

あなたのディレクティブはまったくロードされていません。モジュール名を ng-app のように指定する必要があります<body ng-app="app">。その後、ngModel.$setViewValue(ngModel.$viewValue)因子が変更されるたびに呼び出すだけです。

angular.module('app', []).directive('multiply', multiplyDirective);

function multiplyDirective() {
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            factor: '=multiply'
        },
        link: function(scope, elem, attr, ngModel) {

            ngModel.$formatters.push(function (value) {
                return value / scope.factor;
            });

            ngModel.$parsers.push(function (value) {
                return value * scope.factor
            });

            scope.$watch('factor', function () {
               // how to run the parsers pipeline to update modelvalue?
              ngModel.$setViewValue(ngModel.$viewValue);
             
            });
        }
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


<body ng-app="app" ng-init="factor = 1; value = 1">
  <input type="number" ng-model="value" multiply="factor" /> x
  <input type="number" ng-model="factor" />
  = {{ value }}
</body>

于 2014-12-19T14:40:43.010 に答える
0

v1.3.18 のソースから、パブリック API が表示されません。パイプラインは、$ commitViewValueからも呼び出される$$parseAndValidateメソッドから行われます(別の値をコミット/設定する必要があります。そうしないと戻ります) 。

于 2015-08-21T21:34:59.590 に答える