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 相关文章推荐
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
深入理解javascript作用域和闭包
Sep 23 Javascript
jQuery中nextUntil()方法用法实例
Jan 07 Javascript
jQuery中offsetParent()方法用法实例
Jan 19 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
js处理层级数据结构的方法小结
Jan 17 Javascript
Angular中的$watch、$watchGroup、$watchCollection
Jun 25 Javascript
实现高性能javascript的注意事项
May 27 Javascript
ES6 新增的创建数组的方法(小结)
Aug 01 Javascript
vue 更改连接后台的api示例
Nov 11 Javascript
如何构建一个Vue插件并生成npm包
Oct 26 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个人网站架设连环讲(三)
2006/10/09 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python实现12306火车票查询器
2017/04/20 Python
Django中的用户身份验证示例详解
2019/08/07 Python
使用python实现对元素的长截图功能
2019/11/14 Python
wxPython实现列表增删改查功能
2019/11/19 Python
浅析Django中关于session的使用
2019/12/30 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
工程总经理工作职责
2013/12/09 职场文书
企划主管岗位职责
2013/12/12 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
机关搬迁方案
2014/05/18 职场文书
公司规章制度范本
2015/08/03 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
安全责任协议书范本
2016/03/23 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript