使用Angular将参数从控制器传递到服务

时间:2014-09-30 12:06:04

标签: angularjs

我有一个服务,它执行HTTP调用并获取某些特定URL的数据。 我想要做的是将一个参数从Controller传递给服务,并将其用作我的URI中的参数。

例如,我现在的电话是api.myurl.com/foo,我想把它变成api.myurl.com/foo/bar

其中 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();
});

Controller 是这样的:

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;
            })();


    }
}

]);

1 个答案:

答案 0 :(得分:0)

控制器中的哪个位置您使用MyMapper变量的引用,但MyMapperMyMapper的实例,因此find } 功能。因此,在 controller 中,您可以拥有以下代码

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

调用find 对象MyMapper 函数并存储返回的 promise >功能。然后,您可以像这样监听承诺的结果

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

此外,我认为您应该使用factory功能而不是service

这就是你所需要的(假设所有内容都为Javascript编译并为Angular注册)。