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控件autocomplete 0.11演示及下载 1月5日已更新
Jan 09 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
js 距离某一时间点时间是多少实现代码
Oct 14 Javascript
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
JQuery获取表格数据示例代码
May 26 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
Feb 03 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
谈谈JavaScript中的几种借用方法
Aug 09 Javascript
浅析Javascript ES6新增值比较函数Object.is
Aug 24 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
Nov 30 Javascript
五步轻松实现zTree的使用
Nov 01 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
php5中类的学习
2008/03/28 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP多态代码实例
2015/06/26 PHP
phalcon框架使用指南
2016/02/23 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
JavaScript 注册事件代码
2011/01/27 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
django 类视图的使用方法详解
2019/07/24 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
pymysql 开启调试模式的实现
2019/09/24 Python
中学运动会广播稿
2014/01/19 职场文书
总经理岗位职责范本
2014/02/02 职场文书
文明村创建实施方案
2014/03/27 职场文书
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
PHP正则表达式之RCEService回溯
2022/04/11 PHP