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 插件 任意位置浮动固定层
Dec 25 Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
javascript之Boolean类型对象
Jun 07 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
详解Angular 4.x NgTemplateOutlet
May 24 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
vue配置多页面的实现方法
May 22 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
JavaScript中的this妙用实例分析
May 09 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
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
JavaScript 学习技巧
2010/02/17 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
Python中__name__的使用实例
2015/04/14 Python
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Django 大文件下载实现过程解析
2019/08/01 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
用python制作个视频下载器
2021/02/01 Python
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
党员党性分析材料
2014/02/17 职场文书
法学院毕业生求职信
2014/06/25 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
财务工作检讨书
2014/10/29 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
python批量创建变量并赋值操作
2021/06/03 Python
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
python实现剪贴板的操作
2021/07/01 Python