2

タグ内にある動的に作成された入力フィールドでサーバー側の検証を行っています。問題は、API エラー メッセージをコントローラーに直接設定するのではなく、テンプレートに戻す必要があることです。コントローラーで設定すると、すべての入力フィールドに影響します。

私の計画は、次のようなことをすることです:

#Template
..<span ng-show="innerNameForm.name.$error.apiResponse">{{ msg }}</span>


..<input type="text" ng-change="msg = someFunction(inputValue, innerNameForm)"...... />

#Controller
scope.someFunction = function(value, form){

    apiMsg = timeout(function() {

        var prom = vcRecordValidate.name(value, record_id).then(function(promise){

            //If fails... do this
            form.name.$setValidity('apiResponse', false);... 
            return promise; //THis contains the API error message

        });
        
        return prom;

    }, 1000);

    return apiMsg;

};

コードは単なる例であり、重要でないものがいくつか欠けています..

質問は.. promise-data をテンプレートに戻すにはどうすればよいですか?

4

2 に答える 2

1

promise を通じてデータを「返す」ことはありません。データで約束を果たします。promise.resolve(data)コールバックに渡すには呼び出す必要がありdataます。

于 2013-09-12T18:51:57.013 に答える
0

Angular は、 の$scope場合からのモデルの表示をサポートしますpromise

$scope.load = function (i) {
  var deferred = $q.defer();
  $timeout(function () {
     deferred.resolve('done with ' + i + ' !');
  }, 3000);
  return deferred.promise;
}
...
<span ng-repeat="item in items">{{load($index)}}</span>

しかし、これは扱いにくく、再帰呼び出しや無限$apply呼び出しが発生する可能性があります。私があなたなら、配列内のすべてのアイテムのサブ変数を表示するだけです

<span ng-repeat="item in items">{{item.asyncResult}}</span>

たとえば、このようなすべてのアイテムのロードを非同期的にトリガーします

$timeout(function () {
  angular.forEach($scope.items, function (item, idx) {
    item.asyncResult = 'done with ' + idx + ' !';
  });
}, 3000);

また、特定のフォーム内で同じ名前の複数の入力を処理するには、Angular はフォーム入力の動的な名前をサポートしていないためng-form、同じ名前でネストされたものを使用することをお勧めします (詳細については、この質問を参照してください)。

于 2013-09-12T18:58:26.583 に答える