[angularjs] How to pass in parameters when use resource service?

A very rookie-ish question:

I'm trying to build resource object using factory method:

.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
    });
  }])

This method is easy because all params are predefined, organEntity and organCommpassword are defined inside tag.

Now for a different resource object, I need to pass in parameter when the factory is called.

I imagine the calling code of this resource object should look like:

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

I know query() method can add parameters: Magazines.query(params, successcb, errorcb);

I wonder if I just pass in parameters, can I get the parameter at the factory? How to specify such passed in parameters in the factory method?

For example, now suppose I cannot get organId from url anymore, I need to pass it in from my controller, how to receive organId within the factory method?


Here is my resource 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
    });
  })

Here is my controller:

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

I tried to pass in the parameter, but it causes an error

This question is related to angularjs

The answer is


I suggest you to use provider. Provide is good when you want to configure it first before to use (against Service/Factory)

Something like:

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

And now controller:

function MyCtrl($scope, Magazines) {        

        Magazines.invoke();

       ....

}