【问题标题】:How to pass in parameters when use resource service?使用资源服务时如何传入参数?
【发布时间】:2013-10-22 08:12:29
【问题描述】:

一个非常菜鸟的问题:

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

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

我试图传入参数,但它导致错误

【问题讨论】:

  • 我对你在做什么有点困惑,更多的代码可能会有所帮助。为什么从哪里获得organId 很重要?正如你已经说过的,当控制器调用它时,我只是将值传递给 .query() 方法。工厂只在您的应用程序中调用一次,因此“Magazines”是一个单例。
  • 所以我可以通过 .query() 从我的控制器传入参数,然后在工厂中使用它?
  • 我认为你不清楚工厂是做什么的。当您指定它取决于构造函数中的“杂志”时,工厂创建一个传递给您的控制器的对象。所以你返回的资源 杂志在你的控制器中,它的工作方式就像文档所说的那样。或者您是说您想为我可以向您展示的特定控制器使用不同的默认值,但我认为仅使用“params”调用查询应该适合您的情况。
  • @ChrisNicola 对不起。我在传递参数时遇到了一些问题。我的控制台告诉我magId is not defined。我的传入方法有误吗?

标签: angularjs


【解决方案1】:

我想我看到了你的问题,你需要使用@ 语法来定义你将以这种方式传递的参数,而且我不确定 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(我知道它有点不透明)并查看最后的示例,这应该会有很大帮助。

【讨论】:

  • 哈哈,别管那个loginID和密码了。它们在 HTML 中的 <script></script> 中定义。谢谢!我会更仔细地阅读文档!
  • 所以它们是全局变量还是什么的?
  • 对此竖起大拇指,不仅因为它解决了我的问题,而且还因为您说要查看文档...这应该始终是我做的第一件事!哈哈哈
【解决方案2】:

我建议你使用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();

       ....

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    相关资源
    最近更新 更多