2013-10-29 79 views
2

我有一個工廠,獲取從服務器的問題清單測驗類型的應用程序:AngularJS工廠只調用一次

xoryApp.factory('questionService', function($http) { 
    return { 
    qdata : function(callback) { 
     $http.get('/static/question.json').success(callback); 
    } 
}; 
}); 

然後我把這個廠在我的控制器是這樣的:

questionService.qdata(function(results) { 
    $scope.qdata = results; 
}); 

然後,當我循環回答問題時,我會在問題和回答部分視圖之間來回切換。問題是每次問題視圖加載時,它都會從服務器重新加載工廠json。但我希望它只在加載應用程序時執行,而不是每次加載使用該控制器的部分視圖。

你在角度上實現的方式是什麼?

謝謝

+0

呼叫questionService.qdata一個函數裏?或者這個代碼放在控制器根目錄下? –

+0

它在控制器的根部 – bwbrowning

+0

每次加載控制器時,都會調用此函數,因爲根代碼將被執行。你需要放入一個函數並有條件地調用。我現在會爲你創造一個蹲點,5分鐘=) –

回答

2

發生這種情況是因爲您正在調用控制器根函數內的工廠。 每次加載控制器時,都會再次打電話給工廠。

我建議這個plunker as solution。也許這不是最好的,但工作正常。

在這種情況下,我將列表實例保存在工廠內的變量上,並且只加載一次。如果你需要刷新,那麼你可以調用一個不同的函數來強制刷新到服務器端。

以下幾個可能的解決方案:

app.factory('questionService', function($http) { 
    var result; 
    return { 
     qdata : function(callback) { 
      return result; 
     }, 
     fecthData : function(callback) { 
      result = $http.get('question.json').success(callback); 
      return result; 
     } 
}; 
}); 

app.factory('questionService2', function($http) { 
    var result; 
    return { 
     qdata : function(callback) { 
      if (!result) { 
       result = $http.get('question2.json').success(callback); 
      } 
      return result; 
     }, 
     refreshQdata : function (callback) { 
     return $http.get('question2.json').success(callback); 
     } 
}; 
}); 

我希望它能幫助。

4

緩存的服務方法內的服務器調用的結果,你是好去

xoryApp.factory('questionService', function($http) { 
var questions; 
    return { 
    qdata : function(callback) { 
     if(questions) { 
      callback(questions); 
     } 
     else { 
     $http.get('/static/question.json').success(function(data) { 
     questions=data; 
     callback(questions); 
     }); 
    } 

    } 

}; 
});