2014-09-10 43 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 
}); 
相關問題