angularjs 彻底的异步解决

        angularjs的异步处理的真的很不错。基于消息广播的方式,并且可以向上传递,基本上解决了不同模块,不同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
        });
};



你可能感兴趣的:(arcgis)