gpt4 book ai didi

javascript - $rootScope :inprog Action already In Progress

转载 作者:行者123 更新时间:2023-12-03 07:18:13 26 4
gpt4 key购买 nike

我开始使用 Angular Material 并很难理解 $scope.apply 功能的问题...我尝试通过调用 apply 来通知 UI 有关更改的信息,但失败并出现错误。我知道也有类似的问题,但就我而言,数据不是由 scope 存储的,而是由 Controller 实例存储的......

我还使用 TypeScript 来实现我的 Controller ;不确定,但这似乎很不常见,因为我发现的大多数示例代码都是基于 View 中的内联 Controller 实现。

我的 Controller 看起来像这样...

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;
}
}

Controller 提供了 querySampleData 方法,该方法从远程服务获取一些数据(它使用 IHttpService 进行异步 API 调用)。 View 通过以下方式使用 Controller ...

<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>

Controller 的初始化工作正常;所有依赖项都被正确注入(inject)到 Controller 中,并且与 querySampleData 方法的绑定(bind)也按预期工作(当我单击按钮时,该方法被调用)。如果我将接收到的数据分配给模型,则 UI 不会更新,因此我添加了对 $apply 方法的调用,以便通知 UI 有关更改的信息...这给了我提到的错误如上所述。

更新:

文档位于:https://docs.angularjs.org/error/$rootScope/inprog建议使用$timeout代替$apply来保证异步执行;当然,这修复了错误,但 UI 没有改变...

最佳答案

AngularJS Promise 已经在其回调中调用了 .apply() (在后台)。您无法在回调中再次调用 .apply,因为它们已经被 .applied,并且错误“In Progress”准确地说明了这一点。只需删除 .apply 调用,它就会起作用,除非您有更多错误。

关于javascript - $rootScope :inprog Action already In Progress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com