AngularJS 异步解决实现方法


Posted in Javascript onJune 12, 2017

AngularJS 异步解决实现方法

Angular 的异步处理的真的很不错。基于消息广播的方式,并且可以向上传递,基本上解决了不同模块,不同controller之间不方便异步的问题。

        场景一:通过回调函数进行异步操作(该情况下不用消息广播的机制)

        这种情况的特点是直接传递一个回调函数给异步操作就可以了,等异步操作完执行回调。

        比如:controller通过server异步取数据,等取完数据进行一系列的操作,这个时候就可以把操作封装到函数中,传递给异步操作函数。

        controller代码片段举例如下:

$scope.submit=function(){ 
  userService.login($scope.user.loginname.value,$scope.user.password.value,function(data){ 
    if(data.success){ 
      location.href = '../../views/main/index.html'; 
    }else{ 
      $scope.user.error.tip=data.msg; 
    } 
  }); 
};

         最后一个参数即为回调函数

         server代码片段举例如下:

return { 
    http:$http, 
  token:'', 
  auth:[], 
  loginname:'', 
  login:function(loginname,password,fn){ 
     this.http({ 
    url:'../../scripts/loginModule/services/loginOKTest.js', 
    method:'GET' 
     }) 
     .success(function(data){ 
     if(data[0].success){ 
       ... 
           //调用回调方法 
           fn(data[0]); 
     } 
      }) 
     .error(function(data,header,config,status){ 
    alert("验证服务请求失败!"); 
     }); 
  } 
}

         场景二:没有传递回调函数的地方,这个时候就必须用到消息广播的机制。

         比如:我的controller通过server异步获取数据,这个时候我用回调函数保证取到数据后做后续操作。但是我的后续操作需要通过指令进行DOM的生成。这个时候我们是没有办法直接调用指令的link或者compile的。这个时候我们需要用到广播$scope.$broadcast。发送广播以后,需要通过$scope.$on进行监听。

         controller代码片段举例如下:

//通过categoryService异步取数据 
categoryService.initCategory(loginname,token,function(category){ 
    $scope.category=category; 
    $scope.$broadcast("categoryLoaded"); 
});

         service代码片段举例如下:

initCategory:function(loginname,token,fn){ 
  this.http({ 
  url:'../../scripts/mainModule/services/mainCategory.js', 
  method:'GET' 
  }).success(function(data,header,config,status){ 
    fn(data); 
    }).error(function(data,header,config,status){ 
    alert("验证服务请求失败!"); 
  }); 
}

         directive代码片段举例如下:

link:function ($scope, $elem, attrs) { 
   $scope.$on("categoryLoaded", function (event, args) { 
      //$scope.category即为异步获取的数据 
   } 
}

最后,如果我们在这个controller中需要调用另外一个模块的指令的link或者compile或者另一个模块的controller怎么办。我们需要通过依赖注入$rootScope服务,因为他是所有作用域的父,然后调用$emit这个服务进行广播。指令中通过$rootScope.$on进行接收即可。

        模块1(app.video)中的controller代码片段举例如下:

$scope.replay=function(id){ 
  console.log("click replay id:"+id); 
  clearReply(); 
  //通过$rootScope广播消息给app.dialog模块的controller 
  $rootScope.$emit("openTemplate","reply.html"); 
};

       模块2(app.dialog)中的controller代码片段举例如下:

$rootScope.$on('openTemplate',function(event, toState, toParams, fromState, fromParams){ 
    $scope.openTemplate(toState); 
}); 
     
$scope.openTemplate = function (url) { 
    if(!url) 
      url="/ZVideo-MVC/dialog/defaultTemplate.html"; 
    $scope.value = true; 
    ngDialog.open({ 
      template: url, 
      className: 'ngdialog-theme-plain', 
      scope: $scope 
    }); 
};

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery下json数组的操作实现代码
Aug 09 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
将json对象转换为字符串的方法
Feb 20 Javascript
JQuery基础语法小结
Feb 27 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 Javascript
使用vue构建一个上传图片表单
Jul 04 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
javascript浏览器用户代理检测脚本实现方法
Oct 27 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
jquery+css实现侧边导航栏效果
Jun 12 #jQuery
angularjs实现上拉加载和下拉刷新数据功能
Jun 12 #Javascript
Vue非父子组件通信详解
Jun 12 #Javascript
详解angularjs 关于ui-router分层使用
Jun 12 #Javascript
Vue 2中ref属性的使用方法及注意事项
Jun 12 #Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 #Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 #jQuery
You might like
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JS验证字符串功能
2017/02/22 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
node.js中axios使用心得总结
2017/11/29 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python 专题一 函数的基础知识
2017/03/16 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
如何用python整理附件
2018/05/13 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
pyqt5中动画的使用详解
2020/04/01 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
计算机专业毕业生自我鉴定
2014/01/16 职场文书
元旦晚会邀请函
2014/01/27 职场文书
超市促销活动总结
2014/07/01 职场文书
元旦晚会活动总结
2014/07/09 职场文书
毕业设计论文评语
2014/12/31 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android