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的$.event.fix函数统一浏览器event事件处理
Dec 21 Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 Javascript
table行随鼠标移动变色示例
May 07 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
jQuery绑定事件on()与弹窗的简要概述
Apr 27 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
JS实现的二叉树算法完整实例
Apr 06 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
微信小程序scroll-view组件实现滚动动画
Jan 31 Javascript
js实现时间日期校验
May 26 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 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输出时间差函数代码
2013/01/28 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
Python中Selenium库使用教程详解
2020/07/23 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
护林员个人总结
2015/03/04 职场文书
作文之亲情600字
2019/09/23 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫