如何使用 Promise 将参数传递给 AngularJS 中的函数

Posted

技术标签:

【中文标题】如何使用 Promise 将参数传递给 AngularJS 中的函数【英文标题】:How to pass parameter to function in AngularJS with promises 【发布时间】:2016-11-18 08:30:40 【问题描述】:

我想向服务函数发送参数。

getQuestions : function(stateCode) : questionResource.js

stateCode 是根据 dtoResource.rc1Step1DTO() 的响应在 $scope 中设置的

angular
    .module('autoQuote')
    //Do initalization on page load
    .run(['$log', '$rootScope', '$state', 'dtoResource', 'questionResource', function($log, $rootScope, $state, dtoResource, questionResource) 
        $log.info('Post DTO on page load.');
        dtoResource.rc1Step1DTO()
            .then(questionResource.getQuestions)
            .then(function(questions) 
                $rootScope.questions = questions;
                console.log('Obtained questions. Assigned to rootscope');
            )
            .then(function() 
                console.log('This should be printed after the above methods are done     executing');
                console.log($rootScope);
            );

    ])

如何将状态代码传递给其他函数。 它在范围内的位置是

$scope.postAutoQuoteObj.SessionInfo.StateCode

下面是代码 http://plnkr.co/edit/Op1QDwUBECAosPUC7r3N?p=preview

【问题讨论】:

您的 run() 函数甚至在您的控制器存在之前就运行了,并且您正在谈论的 $scope 无法从 run() 函数中访问。我认为您需要先解决 that 的后勤问题。 我在.run中写的函数我想在dom加载后执行,但是这些方法是独立的,应该是同步顺序的。你能建议我应该做些什么改变吗?在处理参数传递问题之前。 【参考方案1】:

您的模块 autoQuote.run() 只会在您的应用程序加载期间被调用一次。所以不要指望它会再次执行。

您已接近正确答案。你只需要做一些重组。我要提供的一个提示是担心稍后创建指令,首先让控制器、路由首先工作。 您已经创建了一个出色的框架来开始。您正在使用 ui-router。 这意味着您可以告诉 ui-router 在请求状态时执行哪个控制器。所以你的应用程序的生命周期如下

module.run //这里的任何代码首先。仅在初始负载 module.config //在你的情况下 app.config 创建你的状态。

然后取决于您根据 url 查看的状态; 该状态(或视图)的控制器将被执行

因此,如果您为 / 添加另一个状态配置,您可以将该状态绑定到您的 autoQuoteCtrl。

此外,还有许多其他问题,例如尝试在输入元素中使用 ng-model 和 value。这是不正确的。

你没有实现你的 ui-views。这将意味着您的控制器将永远不会执行。从技术上讲,您的情况 autoQuoteCtrl 将被执行,但这只是因为您使用 ng-controller 将其强制到页面上,而这是 ui-router 旨在避免的。

我认为这就是您最终将代码放在 .run() 中的原因。这是您发现您的应用程序会在页面加载时“运行”代码的唯一地方,这是错误的,它只是因为您的应用程序加载而运行。对不起,如果我是多余的。但这是很重要的一点。

另外,您正试图通过将状态码传递给您的资源来访问您的 json 数据。这不是 $resource 的工作方式。您传递资源的名称,它将返回该资源的所有内容。然后在返回承诺后过滤代码。你只有一种资源。那是“CA.json”,因此您应该能够在资源服务中只使用一行并且只需要一项资源服务。您将需要额外的非资源服务来完成从 JSON 中过滤出正确数据的繁重工作。通常这就是为什么一个应用会调用不同的资源,以便每个都返回所需的模型,而不是单一的单一资源。

你永远不应该使用 document.getElementById() 你正在使用 angular,所以你不直接与 dom 交互

最后,这里有一个经过大量修改的 plunkr,可以帮助您朝着正确的方向前进。

http://plnkr.co/edit/dUJm01uu7RnhltC2pLLb?p=preview

【讨论】:

以上是关于如何使用 Promise 将参数传递给 AngularJS 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给promise函数

使用 promise/thunk 通过 action 将参数传递给 reducer

将额外参数传递给jquery ajax promise回调[重复]

如何将参数传递给 Play 中的 Jobs!框架 1.2.x?

Promises,将附加参数传递给 then 链

Promise:如何传递带参数的函数? [复制]