2016-01-22 24 views
2

我的控制器看起來像這樣不能使用。那麼()NG-點擊函數內部

function menuController($scope, dataService) { 

    $scope.getMenuItem = '';  
    $scope.submenu = new Array(); 

    var setMenuItems = function (w) { 
     $scope.submenu = new Array(); 
     $.each(w, function (i, val) { 

      if ($scope.getMenuItem == 'year') { 
       $scope.submenu.push({ 
        name: val[0].year, link: year 

       }); 
      } 

     }); 
    } 
    $scope.UpdateSubmenu = function (a) { 
     $scope.getMenuItem = a; 

     loadData(); 
    }; 
    var loadData = function() { 
     dataService.getAlbums().then(setMenuItems); 
    } 
    loadData(); 

} 

時loadData()初始化過程中調用它工作正常。但是,當從UpdateSubmenu調用它時,它將失敗TypeError: dataService.getAlbums(...).then is not a function

從ng-click事件中激活UpdateSubmenu功能。

DataService在看起來像這樣

(function() { 
    "use strict"; 
    var dataService = function ($http) { 
     var albums; 

    var getAlbums = function() { 
     if (albums) 
      return albums; 
     return $http.get("./api/Album").then(function (response) { albums = response.data; return albums; }); 
    } 

    return { getAlbums: getAlbums }; 


} 
angular.module("Main").factory("dataService", dataService); 
}()); 

爲什麼不能我用then()不接受?

+3

什麼是'dataService'和'dataService.getAlbums()'?同時顯示這些代碼 – Bikas

+0

現在代碼已添加 – CruelIO

回答

4

這個問題是因爲您正在緩存相冊並返回它,如果它存在。第一次調用getAlbums()時,它返回$http承諾,第二次返回一個相冊數組,它沒有then()方法。

我通常使用$q創建一個承諾,並立即解決它處理這個問題:

(function() { 
    "use strict"; 
    var dataService = function ($http, $q) { 
     var albums; 

     var getAlbums = function() { 

      if (albums) { 
       var deferred = $q.defer(); 
       deferred.resolve(albums); 
       return deferred.promise; 
       // ... or more simply ... 
       //return $q.when(albums); 
      } 
      else { 
       return $http.get("./api/Album") 
        .then(function (response) { albums = response.data; return albums; }); 
      } 
     } 

     return { getAlbums: getAlbums };  
    } 

    angular.module("Main").factory("dataService", dataService); 
}()); 
+0

是的。解決的辦法是返回一個promise,可能是通過angular的'$ q.defer()'。 – ryanyuyu

+0

而不是'$ q.defer();等等''只要'返回$ q.resolve(專輯)'就可以乾淨得多;'或者在老版本的角度中,你可以使用'$ q.when()'。 – Duncan

3

而不是返回相冊...返回$q.resolve(albums)總之......到鏈上的承諾(使用.then()),你必須回報總是回報一個承諾。

相關問題