加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS – 双向绑定承诺 – 处理拒绝

发布时间:2020-12-17 06:46:30 所属栏目:安全 来源:网络整理
导读:我已经发现了一种困难的方式,当你双向绑定一个promise时,angular会为你解除承诺,并且会绑定实际的承诺.我的问题是,如何处理被拒绝的承诺? 我的具体情况是我有一个指令,我从控制器双向绑定一个promise.我的控制器期望该指令处理对该promise的拒绝,因为错误需
我已经发现了一种困难的方式,当你双向绑定一个promise时,angular会为你解除承诺,并且会绑定实际的承诺.我的问题是,如何处理被拒绝的承诺?

我的具体情况是我有一个指令,我从控制器双向绑定一个promise.我的控制器期望该指令处理对该promise的拒绝,因为错误需要在DOM上显示.

在我的指令中,我希望我的绑定变量是一个promise,但我获得了该promise的解析值.烦人,但是,并不可怕.

问题是当该承诺被拒绝时,指令无法知道.

以这个plunker为例:

http://plnkr.co/edit/m0cOqFhx6TNrDxTbr9Qx?p=preview

我如何处理指令中的承诺拒绝?

谢谢,
罗伊

解决方法

我有三个建议 – 没有一个是完美的,但它们都有效:

>创建一个getter方法,该方法返回promise并使用&将此方法绑定到指令
>绑定延迟对象而不是promise(丑陋)
>当承诺解决/被拒绝时广播事件

我已经创建了一个包含所有建议的plunker:http://plnkr.co/edit/jsA0PwpQm0xycLclkBU3?p=preview

>控制器:

app.controller('MainCtrl',function($scope,$q,$timeout) {
  var deferred = $q.defer();

  $scope.promise = deferred.promise;
  $scope.deferred = deferred;

  $scope.getPromise = function(){
    return deferred.promise;
  }

  $scope.promise.then(function(msg){
    $scope.$broadcast('promiseThen',{rejected:false,msg:msg});
  },function(msg){
    $scope.$broadcast('promiseThen',{rejected:true,msg:msg});
  });

  $timeout(function(){deferred.reject('No reason...');},1500)
});

>加价:

<div promise-test deferred="deferred" get-promise='getPromise()' ></div>

>指令:

app.directive('promiseTest',function(){
  return {
    template:'<div>m1: {{m1}}<br>m2: {{m2}}<br>m3: {{m3}}</div>',scope:{getPromise:'&',deferred:'='},link:function(scope,el,attrs){

      scope.m1 = scope.m2 = scope.m3 = 'Waiting...';

      scope.getPromise().then(function(msg){
        scope.m1 = 'Resolve getPromise: '+msg;
      },function(msg){
        scope.m1 = 'Reject getPromise: '+msg;
      })

      scope.deferred.promise.then(function(msg){
        scope.m2 = 'Resolved deferred.promise: '+msg
      },function(msg){
        scope.m2 = 'Rejected deferred.promise: '+msg
      });

      scope.$on('promiseThen',function(ev,val){
        if(val.rejected){
          scope.m3 = 'Rejected promiseThen: '+val.msg
        }else{
          scope.m3 = 'Resolved promiseThen: '+val.msg          
        }
      })
    }
  }
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读