2014-09-30 75 views
0

我有一個服務,它執行HTTP調用並獲取某些數據到特定的URL。 我想要做的是將參數從Controller傳遞給服務,並將其用作我的URI中的參數。從控制器傳遞參數到Angular服務

例如,我的電話是現在api.myurl.com/foo,我希望把它api.myurl.com/foo/bar

酒吧是從搜索表單用戶的輸入。

此刻,我的代碼看起來是這樣的:

服務

angular.module('MyApp').service('MyMapper', function(MyService, $http, $q, API_TR_URL, _, PAGINATION_LIMITS) { 
function MyMapper() {} 

    MyMapper.prototype.find = function(params) { 
    var p = angular.copy(params); 
    p.limit = PAGINATION_LIMITS.myResolver; 
    var d = $q.defer(); 

    var requestURL = API_TR_URL + '/app_dev.php/entities/' + param; 

     $http.get(requestURL) 
     .success(function(results) 
     { 
      console.log('Results data entities: ', results.data.data.entities); 
      for (var entitiesIndex in results.data.data.entities) 
      { 
       var preparedData = results.data.data.entities[entitiesIndex]; 
       results.data.data.entities[entityIndex] = new Entity(preparedData); 
      } 

      d.resolve(results); 
     }) 
     .error(function(status) 
     { 
      d.reject(arguments); 
     }); 

    return d.promise; 
    }; 

return new MyMapper(); 
}); 

控制器這樣的:

angular.module('MyBackendApp') 
.controller('MySearchFormController', ['$scope', 'API_TR_URL', 'MyMapper', '$location', function($scope, MyMapper, $location){ 
    $scope.submit = function(){ 

      console.log('-- Search string: '+ $scope.entityName); 

      var entitiesCount = Object.keys(data.data.data.entities).length; 
      $scope.totalPagesNum = Math.ceil(entitiesCount/10); 
      $scope.page = data.page; 

      var d = $q.defer(); 

      // Build the results 
      $scope.entitiesResults = (function listEntities(entities, $scope){ 

       var entities = data.data.data.entities; 

       if ((typeof entities === 'undefined') || (entities.length === 0)){ 
        return null; 
       } 

       return entities; 
      })(); 


    } 
} 

]); 

回答

0

無論在哪裏你控制器你使用你對的參考嗎?變量,但MyMapperMyMapper的一個實例,因此具有find函數。因此,在您控制器你可以有下面的代碼

var promise = MyMapper.find({param1:1,param2:"a"}); 

它調用find功能MyMapper對象和存儲承諾功能返回。然後,您可以監聽承諾的結果,像這樣

promise.then(function(entities) { 
    //TODO ON SUCCESS 
}, function(errorMsg) { 
    //TODO ON FAIL 
}); 

此外,我認爲你應該使用的,而不是servicefactory功能。

這就是你所需要的一切(假設所有的東西都是爲Javascript編寫的,並且註冊了Angular)。

+0

我做出了您建議的更改。 所以,我傳遞了這樣的實體名稱:MyMapper.find({param:$ scope.a}); 如何在工廠中訪問它以將其包含在以下URL中? var requestURL = API_TR_URL +'/app_dev.php/entities/'+ param; ? 我看不到能夠使用它。 – thitami 2014-09-30 12:29:05

+0

你可以在find中找到另外一個參數('param')或引用'params.param'或'p.param'(因爲'p'是'params'的副本) – 2014-09-30 12:32:14

+0

看來目前MyMapper工廠甚至沒有被調用。我需要調試它。 – thitami 2014-09-30 12:41:18

相關問題