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 相关文章推荐
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
JavaScript 事件冒泡简介及应用
Jan 11 Javascript
IE8 中使用加速器(Activities)
May 14 Javascript
JSON 和 JavaScript eval使用说明
Jun 13 Javascript
一个报数游戏js版(约瑟夫环问题)
Aug 05 Javascript
js中文逗号转英文实现
Feb 11 Javascript
JavaScript利用正则表达式去除日期中的-
Jun 09 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
详解vue组件基础
May 04 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
PHP实现下载功能的代码
2012/09/29 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
用javascript实现画板的代码
2007/09/05 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
销售高级职员求职信
2013/10/29 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
文员岗位职责
2015/02/04 职场文书
企业投资意向书
2015/05/09 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书