如何在angularJS中参数化$ resource调用?

时间:2016-07-20 11:48:21

标签: javascript angularjs angular-resource

我有这个工厂:

angular.module('core.actor').factory('Actor', ['$resource',
    function ($resource) {
        return $resource('api/actor/:actorId/', {}, {
            query: {
                method: 'GET',
                isArray: true,
                cache: true
            },    
            update: {
                method: 'PUT'
            }
        });
    }
]);

这是我的分页功能的一部分:

if (self.pk == "-6" && self.searchTerm == undefined) {
    self.actorsToAdd = Actor.query({
        offset: pageOffset,
        limit: pageLimit
    })
} else if (self.pk == "-6") {
    self.actorsToAdd = Actor.query({
        offset: pageOffset,
        limit: pageLimit,
        search: self.searchTerm
    })
} else if (self.searchTerm == undefined) {
    self.actorsToAdd = Actor.query({
        offset: pageOffset,
        limit: pageLimit,
        pk: self.pk.toString()
    })
} else {
    self.actorsToAdd = Actor.query({
        offset: pageOffset,
        limit: pageLimit,
        search: self.searchTerm,
        pk: self.pk.toString()
    })
}

它根据特定条件更改Actor生成的GET请求。我正在寻找一种参数化这个功能的方法,这样我就可以取代“演员”了。用变量。

有些事情:

pageType = Movie;

var page = function (pageType){

  self.itemsToAdd = pageType.query({
      offset: pageOffset,
      limit: pageLimit
  })  
}

有可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

这就是我这样做的方式,而不是将单个参数传递给查询,传入一个包含查询参数的对象。

angular.module('core.actor').factory('Actor', ['$resource',
  function ($resource) {
     return $resource('api/actor/:actorId/', {}, {
       query: {
       method: 'GET',
       isArray: true,
       cache: true,
       params: { queryParams: '@_queryParams' }
    },
    update: {
      method: 'PUT'
    }
  });
}
]);

所以你对它的调用看起来像这样

Actor.query({ queryParams: {
    offset: pageOffset,
    limit: pageLimit,
    pk: self.pk.toString()
}})

然后在服务器上,我查看我的(json解析)参数中包含哪些值,以便在数据库上构造适当的查询。

在您最新评论之后,这是您正在寻找的那种东西吗?

angular.module('core.actor').factory('Api', ['$resource',
  function ($resource) {
    return {
      actor: $resource('api/actor/:actorId/', {}, {
        query: {
      method: 'GET',
      isArray: true,
      cache: true,
      params: {queryParams: '@_queryParams'}
    },
    update: {
      method: 'PUT'
    }
  }),
  movie: $resource('api/move/:moveId/', {}, {
    query: {
      method: 'GET',
          isArray: true,
          cache: true,
          params: {queryParams: '@_queryParams'}
        },
        update: {
          method: 'PUT'
        }
      })
    };
  }
]);

然后你可以调用Api.movi​​e.query()或Api.actor.query()

为了完整起见,下面是我的服务器端代码在构建查询时的外观。

var constructUserQuery = function (queryParams) {
  var query = { $or: [], $and: [] };

  if (queryParams.name) {
    query.$and.push({ displayName: { $regex: queryParams.name,     $options: 'i'} });
  }

  if (queryParams.client) {
    query.$or.push({ client: mongoose.Types.ObjectId(queryParams.client) });
  }

  if (queryParams.roles) {
    query.$or.push({ roles: { $in: queryParams.roles }});
  }

  // Ignore the current user, if it's supplied
  if (queryParams.user) {
    query.$and.push({ _id: { $ne: queryParams.user._id }});
  }

  // Clean up any empty arrays
  if (query.$or.length === 0) {
    delete query.$or;
  }

  if (query.$and.length === 0) {
    delete query.$and;
  }

  return query;
};

显然这是我的具体情况,但你明白了。这是我有if语句的唯一地方。