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 相关文章推荐
DOM 中的事件处理介绍
Jan 18 Javascript
javascript arguments使用示例
Dec 16 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
Feb 10 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
Apr 21 Javascript
微信小程序多音频播放进度条问题
Aug 28 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 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 import 文件内容变量失效的问题
2013/06/20 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
浅析python中while循环和for循环
2019/11/19 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
如何对python的字典进行排序
2020/06/19 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
2014年四风问题自我剖析材料
2014/09/15 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
会计求职简历自我评价
2015/03/10 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
军事理论课感想
2015/08/11 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
解决Redis启动警告问题
2022/02/24 Redis