AngularJS服务返回对错误控制器实例的响应

时间:2018-11-12 13:52:30

标签: javascript angularjs promise controller

[注意:由于我不太确定从哪里开始寻找该问题,因此目前我不包括任何示例代码。根据评论/建议,我将编辑此帖子并添加所需的内容]

我们正在研究SPA Web应用程序(AngularJS),最近发现了一个奇怪的行为(显然,它从一开始就存在,但直到现在才被发现)。该应用程序设计为以多选项卡方式工作,每个选项卡专门处理特定类型的数据,并包含一个“刷新”按钮以从数据库重新加载数据。例如,有一个选项卡用于创建和更新用户配置文件,第二个选项卡用于创建和更新用户。每个标签都分配有自己的(不同名称)控制器。

打开两个不同的选项卡时,一个叫“个人档案”,另一个叫“用户”,每个选项卡都接收自己的数据,并且不同的作用域之间有明显的区别。

打开相同类型的两个选项卡(例如,“用户配置文件”选项卡的两个实例)时,问题开始:

  • 在第二个实例中收到从第一个打开的(实例)选项卡中触发的对数据库的查询。
  • 第二个实例中还收到了从第二个打开的(实例)选项卡中触发的对数据库的查询。
  • 关闭第二个实例时,第一个选项卡上的所有其他查询均无响应。

我似乎会看到第二个实例以某种方式覆盖了Promise函数的指针(在来自数据库的响应到达后即被调用)。我们为了确认这一假设所做的一个简单测试是使用每个选项卡的唯一ID。在触发数据库检索之前以及收到响应时,控制台代码已添加到代码中。结果是在Tab_ID = 0内收到了来自Tab_ID = 1的触发请求。

1 个答案:

答案 0 :(得分:0)

(代表问题作者发布的答案)

我刚刚找到了一个解决方案,实际上是一个非常简单的解决方案:将promise函数作为控制器$scope的一部分。就是这样!

只是为了使解决方案更清楚,初始promise函数如下所示:

 Handle_Server_Response = function (data) {...}

并按如下方式传递了回调指针:

Get_Data_From_Sarver(<arguments>...,Handle_Server_Response) ;

新代码现在如下所示:

 $scope.Handle_Server_Response = function (data) {...}

现在将按如下方式传递回调指针:

Get_Data_From_Sarver(<arguments>...,$scope.Handle_Server_Response) ;

此非常简单的修改可确保回调函数位于控制器实例的正确作用域之内。