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;

};

代码只是一个例子,并且缺少一些不重要的东西..

问题是..如何将承诺数据返回到我的模板?

4

2 回答 2

1

您不会通过承诺“返回”数据。你用数据履行承诺。您需要调用promise.resolve(data)以传递data给您的回调。

于 2013-09-12T18:51:57.013 回答
0

Angular 支持$scopepromise.

$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 回答