2013-01-10 25 views
4

我有類似的工廠與$ HTTP調用裏面像以下:

appModule = angular.module('appModule', []); 

appModule.factory('Search', function($rootScope, $http) { 
    var Search; 
    Search = {}; 
    Search.types: ["bacon"]; 
    Search.pastEvents = null; 
    $http.get('api/highlights').success(function(response) { 
    return Search.pastEvents = response.data; 
    }); 
    return Search; 
}); 

var notes_module = angular.module('notes', []); 

notes_module.config(['$routeProvider', function ($routeProvider) { 

    var notes_promise = ['Notes', '$route', 'Search', function (Notes, $route, Search) { 
    //suspect that Search not having pastEvents ready in time of calling index method 
    //Notes resource 
    return Notes.index({subject_id: 1 }, Search);  
    }]; 

    $routeProvider.when('/notes', { 
    templateUrl:'index.tpl.html', 
    controller:'NotesCtrl', 
    resolve:{ 
     notes: notes_promise, 
    } 
    }); 

}]); 

我應該關心的就是當數據從$ HTTP調用已準備就緒,當這家工廠被初始化/注射? pastEvents會準備好嗎?如果我應該關心我該怎麼辦?

我懷疑搜索對象沒有準備好及時調用Notes資源的索引方法。

+0

您能更具體些嗎?究竟「行爲奇怪」是什麼意思? –

+0

如果您在呈現視圖之前關注數據可用(以避免閃爍),請檢查此[問題(和答案)](http://stackoverflow.com/questions/11972026/delaying-angularjs-route-change-until-模型加載到防止閃爍)。 – bmleite

回答

5

這取決於:

如果立即將在$scope以用於例如在ng-repeat,那麼沒有。

如果你需要在你的控制器的另一個功能,那麼是的。例如。如果您在控制器的過濾器功能中使用pastEvents。在這種情況下,最好在您的服務內部保留所有操作,並使用$q來解決異步謎題。

(這只是一個例子)

appModule.factory('sharedApplication', function($rootScope, $http, $q) { 
    var deferred = $q.defer(); 

    $rootScope.$on('data:loaded', function(e, data) { 
    deferred.resolve(data); 
    }); 

    return { 
    getApp: function(filter) { 
     if (!filter) { filter = function() { return true; } } 

     var filtered = {}; 
     deferred.promise.then(function(data) { 
      filtered.pastEvents = _.filter(data, filter); 
     }; 
     return filtered; 
    } 
    }; 
}); 

一點解釋。數據與服務中的事件一起到達。此時getApp()可能已經被調用。但這並不重要,因爲$q將確保數據只在稍後到達時才被過濾。該控制器不需要知道,只要它不嘗試做這樣的事情:

$scope.app = service.getApp(); 
for(var i = 0; i < $scope.app.pastEvents.length; i++) { 
    ... 
} 

如果你真的需要評估在控制器中的內容,請使用$scope.$watch(),如:

$scope.$watch('app', function(value) { 
    ... 
}, true); 

編輯:

在我看來,在您的情況Search還沒有當您在$routeProvider用它解決:

Notes.index({subject_id: 1 }, Search) 

因此,請嘗試解決Search,而不是在控制器中使用您的Notes資源。

您需要在Search服務中返回承諾。有兩個選項:

  • 返回$ HTTP承諾,但可能不是你想要什麼,如果你需要做一些與第一
  • 使用$ q和返回承諾

數據$ q示例:

appModule.factory('Search', function($rootScope, $http, $q) { 
    var deferred = $q.defer(); 
    $http.get('api/highlights').success(function(response) { 
    deferred.resolve({ 
     type: ["bacon"], 
     pastEvents: response.data)}; 
    }); 
    return deferred.promise; 
}); 
+0

謝謝你的回答,我會檢查它。在你發佈你的答案的時候,我已經更新了我的問題,以便更清楚地... –

+0

仍然停留在此,請問我能否幫助我解決更新的問題? –

+0

我添加了一個編輯。不知道它是否是一個解決方案,雖然 – asgoth

相關問題