在控制器之间共享1个ajax响应

时间:2014-09-10 13:51:26

标签: javascript ajax angularjs

总体情况是 - 我想在一个地方获得ajax呼叫并发送到我的所有控制器(大约8个),并根据字符串答案设置显示/隐藏所有控制器。看起来很简单但是我在解决问题时遇到了一些麻烦。我能够想象出如何在2个控制器之间剪切一个json对象,但这有点不同所以我想也许我正在以不正确的方式应用以前对我有用的逻辑。

我建立了一个工厂,在所有控制器之间共享,如此

.factory('statusCheck', ['$http', function ($http) {

var currentId = self.location.search;
if(currentId[0] === "?"){
    currentId = currentId.slice(1);
}
 var stats = $http({
        method: "GET",
        url: "/getLessonDetails/" + currentId
    })
    .success(function(data, status, headers, config){

    return data.status;
    });

return stats;

}])

我在这里尝试做的就是让它执行ajax调用(你可以忽略currentId部分)并返回data.status。然后在每个控制器中注入statusCheck并使用它。

一旦我将statusCheck作为正确的字符串值返回(data.status将等于3个字符串中的1个),我想在控制器中使用它来显示/隐藏内容。我已经在每个控制器中设置了一个范围布尔值,名为$ scope.editorEnabled,它在我想要的show / hides之间切换(如果设置为true或false。

所以一旦我在控制器中有了statusCheck,我想检查它的值并在控制器中做这样的事情 -

 if(statusCheck == "On"){
 $scope.editorEnabled = true;
 }else if(statusCheck == "Off"){
  $scope.editorEnabled = false;
 }else if(statusCheck == "ViewOnly"){
   $scope.editorEnabled = false;
   $scope.viewOnlyMode= true;
 }

我不知道我的工厂是否工作正常,但是当它确实工作时我想确保在尝试读取控制器中的这些if语句之前我得到了ajax get的字符串,因为它们没有包含在什么都会立刻开火。我不知道这种想法是否有利于角度,我仍在调整自己的过程。任何建议将不胜感激。谢谢你的阅读!

3 个答案:

答案 0 :(得分:2)

您可以在解决http承诺时在工厂返回服务中设置属性,并在控制器中监视要更改的属性;

.factory('statusCheck', ['$http', function ($http) {
    var me = {
        status: 0
    };

    var currentId = self.location.search;
    if(currentId[0] === "?"){
      currentId = currentId.slice(1);
    }

    $http({
        method: "GET",
        url: "/getLessonDetails/" + currentId
    })
    .success(function(data, status, headers, config){
       me.status = data.status;
    });

    return me;
}]);

并在您的控制器中,注意statusCheck.status以更改并执行您想要的任何操作

 $scope.statusCheck = statusCheck;

 $scope.$watch('statusCheck.status', function (newValue) {
       if(newValue == "On"){
          $scope.editorEnabled = true;
       }else if(newValue == "Off"){
          $scope.editorEnabled = false;
       }else if(newValue == "ViewOnly"){
         $scope.editorEnabled = false;
         $scope.viewOnlyMode= true;
       }
 });

答案 1 :(得分:0)

作为一般答案,您可以采取三种方法: -

  1. 将工厂注入每个控制器并将状态显示在视图中。
  2. 作为1,但如果控制器必须执行其他处理(请勿在您的问题中听起来像这样),请添加$ watch。
  3. 使用$ emit广播更改
  4. 我的猜测是,1,这是最简单的,将为你完成工作

答案 2 :(得分:0)

在控制器中,您需要使用.then():

statusCheck.then(function (status) {
    if (status == "On") { ... }
    // the rest of your code
});