2016-02-27 103 views
4

我的應用程序需要一些基本數據才能啓動。這就是爲什麼我創建了一項服務,並將其用作普通數據的模型,以便它可以被所有控制器訪問。我正在嘗試使用ui-route的reslove功能解決該服務,該功能說如果我返回一個承諾,那麼它將在控制器的執行開始之前解決,但它不適用於我。這裏是我的代碼ui-route解析不起作用

服務:

var Data = function ($q, $http) { 
var list = {}; 
var cachedData; 
var resolveData; 

resolveData = function() { 
    return $http.get('/api/data') 
     .then(function (response) { 
      var deferred = $q.defer(); 

      deferred.resolve(list.setData(response.data)); 

      return deferred.promise; 
     }, function (response) { 
     }); 
}; 

list.getData = function() { 
    if (cachedData) { 
     return cachedData; 
    } 
    else { 
     resolveData(); 
    } 
}; 

list.setData = function (data) { 

    cachedData = data; 

    return data; 
}; 
return list; 
}; 

Data.$inject = ['$q', '$http']; 

路線:

.state('temp', { 
     url: 'temp', 
     templateUrl: '/temp', 
     controller: 'temp', 
     resolve: { 
      data: function (data) { 
       return data.getData(); 
      } 
     } 
    }) 

控制器:

var temp = function(data, $scope){ 
    console.log('asad'); 
    $scope.showLoading = true; 

    $scope.prefixes = data.something; //not working 

    $scope.lists = data; 
}; 

temp.$inject = ['data', '$scope']; 

回答

3

第一,它會更容易與plunker工作。

但似乎getData函數沒有返回任何承諾。

我會改變的getData()喜歡的東西:

list.getData = function() { 
var deferred = $q.defer(); 
if (cachedData) { 
    deferred.resolve(cachedData); 
} else { 
    resolveData().then(deferred.resolve).catch(deferred.reject); 
} 

return deferred.promise; 
}; 

順便說一句,我也將改變resolveData()到:

resolveData = function() { 
    var deferred = $q.defer(); 

    $http.get('/api/data') 
     .then(function (response) { 
      list.setData(response.data); 
      deferred.resolve(response.data); 
     }); 

    return deferred.promise; 
}; 
+0

在resolveData功能沒有變化? – nextt1

+0

是的,你這樣做,這就是爲什麼resolveData()返回一個承諾,而getData()不這樣做,我已經用getData()的例子編輯了我的答案。 請嘗試一下,看看它是否有幫助。 – kutomer

+0

It Works ..謝謝你.. – nextt1