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 源代码显示控件 (Ajax加载方式).
May 18 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
Dec 15 Javascript
Javascript简单改变表单元素背景的方法
Jul 15 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
vue.js单页面应用实例的简单实现
Apr 10 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
Vue2.0用户权限控制解决方案
Nov 29 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
Vue封装一个简单轻量的上传文件组件的示例
Mar 21 Javascript
angularJS开发注意事项
May 26 Javascript
微信小程序实现带参数的分享功能(两种方法)
May 17 Javascript
微信小程序用户授权最佳实践指南
May 08 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
smarty中js的调用方法示例
2014/10/27 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
详解webpack babel的配置
2018/01/09 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
python暴力解压rar加密文件过程详解
2019/07/05 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
浪费资源的建议书
2014/03/12 职场文书
父母对孩子说的话
2014/04/12 职场文书
技术负责人岗位职责
2015/02/10 职场文书
社区宣传标语口号
2015/12/26 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书