2014-09-10 78 views
1

大图是 - 我打算在一个地方得到一个ajax调用,然后发送给我的所有控制器(大约有8个),并根据字符串答案设置一个显示/隐藏在所有这些。这似乎很简单,但我在解决问题方面遇到了一些麻烦。我能够弄清楚如何在2个控制器之间删除一个json对象,但这有点不同,所以我想我可能会以不正确的方式应用先前的逻辑。在控制器之间共享一个ajax repsonse

我设立了工厂,像这样

.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部分)和返回数据。状态。然后在每个控制器中注入statusCheck并使用它。

一旦我statusCheck返回作为正确的字符串值(data.status将等于3个字符串中的1)我想在控制器中使用它来显示/隐藏的东西。我已经在每个控制器中设置了一个范围布尔值,名为$ scope.editorEnabled,它可以在我想要的显示/隐藏之间切换(如果设置为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; 
} 

我不知道如果我的工厂,即使正常工作,但是当它我想确保我得到了ajax获取的字符串它会尝试之前在控制器中阅读这些if语句,因为它们没有被包裹在任何东西中,并且会立即触发。我不知道这个思想对角度是否有好处,我仍然在调整自己的过程。特德。谢谢阅读!

+0

'$ http'返回一个承诺,所以这就是你从工厂返回......使用'.then()'访问控制器中的数据 – charlietfl 2014-09-10 14:02:14

回答

2

当http promise被解析时,您可以在您的工厂中设置一个返回服务的属性,并注意要在控制器中更改属性;

.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; 
     } 
}); 
0

作为一个笼统的回答,有三种方法可以采取: -

  1. 将工厂注入每个控制器并将状态显示到视图中。
  2. 为1,但添加$看,如果有额外的处理,控制器必须做(听起来并不像它从你的问题)
  3. 使用$发出广播变化

我的猜测是1,这是最简单的,会做的工作适合你

0

在控制器中,你需要使用。那么():

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