【问题标题】:AngularJS service returning response to wrong controller instanceAngularJS 服务返回对错误控制器实例的响应
【发布时间】:2018-11-12 13:52:30
【问题描述】:

[注意:由于我不太确定从哪里开始寻找问题,因此我暂时不包含任何示例代码。根据 cmets/建议,我将编辑这篇文章并添加任何需要的内容]

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

当打开两个不同的选项卡时,例如一个用于配置文件,另一个用于用户,每个选项卡都会接收自己的数据,并且不同范围之间有明显的区别。

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

  • 在第二个实例中接收到从第一个打开的(实例)选项卡中触发的对数据库的查询。
  • 从第二个打开的(实例)选项卡中触发的对数据库的查询也会在第二个实例中收到。
  • 当第二个实例关闭时,来自第一个选项卡的任何其他查询都不会得到响应。

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

【问题讨论】:

  • 如果没有重现问题的代码示例,就很难判断。可能是您正在使用公共服务。当您打开一个新选项卡时,您会创建一个新的“DB”侦听器。当您关闭一个选项卡时,您将关闭此类型的所有侦听器。再次 - 很难说。如果您可以分享一些代码或更好的代码 - plnkr/codepen/fiddle 上的一个工作示例,它将允许更具体的见解。
  • 感谢@yccteam 的评论。请参阅描述一个非常简单的解决方案的编辑。干杯!!!!
  • @FDavidov 抱歉,但您的问题对其他用户毫无意义,因为它完全不清楚。并且在任何地方传递 $scope 都是 99% 的错误解决方案。
  • @PetrAveryanov,我没有传递$scope,而只是将承诺(函数)定义为$scope 对象。这样,同一控制器的两个实例具有不同的 Promise 函数实例化(因为每个控制器都有自己的 $scope)。我看不出这有什么问题。你呢?

标签: javascript angularjs promise controller


【解决方案1】:

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

我刚刚找到了一个解决方案,实际上是一个非常简单的解决方案:将 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) ;

这个非常简单的修改确保回调函数在控制器实例的正确范围内。

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2012-05-05
    • 1970-01-01
    • 2015-11-15
    • 2018-08-05
    • 2018-02-13
    相关资源
    最近更新 更多