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 相关文章推荐
Google韩国首页图标动画效果
Aug 26 Javascript
jQuery LigerUI 使用教程入门篇
Jan 18 Javascript
如何解决Jquery库及其他库之间的$命名冲突
Sep 15 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
jQuery实现当按下回车键时绑定点击事件
Jan 28 Javascript
超级简单的jquery操作表格方法
Dec 15 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
js+css绘制颜色动态变化的圈中圈效果
Jan 27 Javascript
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
vue中tab选项卡的实现思路
Nov 25 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
dedecms中常见问题修改方法总结
2007/03/21 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP反向代理类代码
2014/08/15 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
Python+django实现文件下载
2016/01/17 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
Python Series从0开始索引的方法
2018/11/06 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Python socket处理client连接过程解析
2020/03/18 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
志愿者服务感言
2014/02/27 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
趵突泉导游词
2015/02/03 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python