使用资源服务时如何传入参数?

时间:2013-10-14 17:22:16

标签: angularjs

一个非常新秀的问题:

我正在尝试使用工厂方法构建资源对象:

.factory('Magazines', [function ($resource) {

    var url = document.URL;
    var urlArray = url.split("/");
    var organId = urlArray[urlArray.length-1];

    return $resource('http://localhost/ci/api/magazines/:id', {
        loginID : organEntity,
        password : organCommpassword,
        id : organId
    });
  }])

这种方法很简单,因为所有参数都是预定义的,organEntity和organCommpassword是在标签内定义的。

现在,对于不同的资源对象,我需要在调用工厂时传入参数。

我想这个资源对象的调用代码应该是这样的:

.controller('ResrouceCtrl', function($scope, Magazines) {
      $scope.magazines = Magazines.query();
});

我知道query()方法可以添加参数:Magazines.query(params, successcb, errorcb);

我想知道我是否只传入参数,我可以在工厂获得参数吗?如何在工厂方法中指定这样的传入参数?

例如,现在假设我不能再从url获取organId,我需要从我的控制器传递它,如何在工厂方法中接收organId?


这是我的资源js:

.factory('MagComments', function ($resource) {


    return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', {
      loginID : organEntity,
      password : organCommpassword,
      id : '@magId' //pass in param using @ syntax
    });
  })

这是我的控制器:

$scope.magComments = MagComments.query({magId : 1});

我尝试传入参数,但会导致错误

2 个答案:

答案 0 :(得分:47)

我想我看到了你的问题,你需要使用@语法来定义你将以这种方式传递的参数,我也不确定你做什么的loginID或密码似乎没有定义它们在任何地方都没有被用作URL参数,所以它们是作为查询参数发送的吗?

根据我到目前为止所看到的,这是我可以建议的:

.factory('MagComments', function ($resource) {
    return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', {
      loginID : organEntity,
      password : organCommpassword,
      id : '@magId'
    });
  })

@magId字符串将告诉资源将:id替换为您将其作为参数传递的对象上的属性magId

我建议仔细阅读the documentation here(我知道它有点不透明),并仔细查看示例,这应该会有很多帮助。

答案 1 :(得分:8)

我建议您使用provider。 如果要在使用之前首先配置它(针对服务/工厂)

,则提供良好的功能

类似的东西:

.provider('Magazines', function() {

    this.url = '/';
    this.urlArray = '/';
    this.organId = 'Default';

    this.$get = function() {
        var url = this.url;
        var urlArray = this.urlArray;
        var organId = this.organId;

        return {
            invoke: function() {
                return ......
            }
        }
    };

    this.setUrl  = function(url) {
        this.url = url;
    };

   this.setUrlArray  = function(urlArray) {
        this.urlArray = urlArray;
    };

    this.setOrganId  = function(organId) {
        this.organId = organId;
    };
});

.config(function(MagazinesProvider){
    MagazinesProvider.setUrl('...');
    MagazinesProvider.setUrlArray('...');
    MagazinesProvider.setOrganId('...');
});

现在控制器:

function MyCtrl($scope, Magazines) {        

        Magazines.invoke();

       ....

}