在vm.init和下拉选项之间Angular中的竞争条件

时间:2017-08-23 13:59:09

标签: angularjs

我正在研究一个C#MVC项目,在视图中使用Angular。该项目具有通过指令实现的自定义下拉控件。视图的JavaScript控制器为BuildingController,后者又提供服务RoomManager

该视图通过调用Building来设置data-ng-init="vm.init('@Model.Id')控制器。在内部,Building.init调用this.RoomManager.init(id),它返回一个承诺。 (ID是相同的,传递给RoomManager。)这反过来缓存了建筑物和房间请求,包括Rooms Array<any>列表。

该视图还通过<UL>设置了下拉控件的列表(实现为data-ng-init="vm.RoomManager.reasonInit('@ViewBag.ReasonId')"元素),其中包含数据库定义的选择原因列表。这将查询数据存储,然后将RoomManager.Reasons数据成员填充为另一个Array<any>。然后,下拉控件使用options="vm.RoomManager.Reasons"设置其选项。

有时这一切都正常运行;有时,下拉控件在其列表中具有正确的行数,但这些值都是错误的空白。我在Web浏览器的JavaScript调试器中放置了断点,并观察到以下内容:

  • reasonInit在之前触发,呈现下拉控件时,控件的列表会正确填充。
  • 在之后触发时,呈现下拉控件,控件的列表不正确。
  • 当原因ID通过reasonInit方法传递到init()的承诺时,控件的列表始终不正确。

这里肯定存在竞争条件。但我不知道如何解决它,使RoomManager方法在适当的时间触发或延迟下拉指令的渲染。

0 个答案:

没有答案