我正在研究一个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
在之前触发,呈现下拉控件时,控件的列表会正确填充。reasonInit
方法传递到init()
的承诺时,控件的列表始终不正确。这里肯定存在竞争条件。但我不知道如何解决它,使RoomManager
方法在适当的时间触发或延迟下拉指令的渲染。