$ rootScope:inprog Action已在进行中

时间:2016-03-30 17:55:34

标签: javascript angularjs typescript angular-material

我开始使用Angular Material并且很难理解$scopeapply功能的问题...每当我尝试通过调用{来通知UI有关更改时{1}}它失败并出现错误。我知道在SO上有类似的问题,但在我的情况下,数据不是由apply存储,而是由控制器实例存储...

我还使用scope作为我的控制器实现;不确定,但这似乎非常罕见,因为我发现的大多数示例代码都是基于视图中的内联控制器实现。

我的控制器看起来像......

TypeScript

控制器提供module MyApp { export class MyController { private scope: angular.IScope; private http: angular.IHttpService; public model: { data: SampleData } = { data: { } }; constructor($scope: angular.IScope, $http: angular.IHttpService) { this.scope = $scope; this.http = $http; } public querySampleData(): void { const serviceEndpoint: string = "http://localhost:8080/api/"; var promise: ng.IHttpPromise<SampleData> = this.http.get(serviceEndpoint + "sample", { }); var callback: ng.IHttpPromiseCallback<SampleData> = ( data: SampleData, status: number, headers: angular.IHttpHeaderGetter, config: angular.IRequestConfig) => { this.scope.apply(() => { this.model.data = data; }; }; promise.success(callback); } } export interface SampleData { message? string; } } 方法,该方法从远程服务获取一些数据(它使用querySampleData进行异步API调用)。视图以下列方式使用控制器......

IHttpService

控制器的初始化工作正常;所有依赖项都被正确地注入到控制器中,并且对<html ng-app="app"> <body ng-controller="MyController as c"> <div> <button ng-click="c.querySampleData()" aria-label="Query sample data">Query sample data</button> <p>{{c.model.data.message}}</p> </div> ... <script src="../scripts/app.js"></script> <script type="text/javascript"> var app = angular.module("app", ["ngMaterial"]); app.controller("MyController", [ "$scope", "$http", MyApp.MyController ]); </script> </body> </html> 方法的绑定也按预期工作(当我单击按钮时调用该方法)。如果我将收到的数据分配给模型,UI不会更新,所以我添加了对querySampleData方法的调用,以便通知UI有关更改...这给了我上面提到的错误。

更新

以下文档:https://docs.angularjs.org/error/$rootScope/inprog建议使用$apply而不是$timeout来确保异步执行;当然这可以修复错误,但UI不会改变......

2 个答案:

答案 0 :(得分:1)

AngularJS承诺已经在回调中调用.apply()(引擎盖下)。您无法在回调中再次呼叫.apply,因为他们已经在应用,并且错误&#34;正在进行中&#34;准确地说明了。只需删除.apply来电即可,除非您有其他错误。

答案 1 :(得分:0)

也许你可以试试 this.model.data = data;然后this.scope.apply();