使用promise中的数据刷新页面后触发Angular 2管道



在我的应用程序中,我有一个由数组填充的表,并在其中使用过滤器。在OnInit中,调用promise来获取数据。现在的问题是,在刷新之后,_prrojects的值(以及transform的输入参数)是未定义的,并且表中没有显示任何内容。当我单击一个下拉列表时,会触发转换函数,并填充表格。当promise中定义_projects时,是否有方法触发管道?我也试过用纯净/不纯净的烟斗。

this._projectService.getProjectsPromise().done(
function (jsdo, success, request){
that._projects = request.response[HorizonData.dsProjects][HorizonData.dsProjects][HorizonData.ttProjects];
for (let project of that._projects) {
project.WhenWhoCreatedFull = project.WhenWhoCreated
var whenwho = project.WhenWhoCreated.split(" ");
project.WhenWhoCreated = whenwho[0] + " " + whenwho[2];
}
}                
)

在我的组件中.html

<tr title="{{ project.INFO }}" *ngFor="let project of _projects | projectFilter: filtered">

角管:

transform(value: IProject[], filterBy: IProject): IProject[] {
return filterBy && value ? value.filter((project: IProject) =>
(project.projectnr.toLowerCase().indexOf(filterBy.projectnr.toLowerCase()) !== -1)
&& (project.projectname.toLowerCase().indexOf(filterBy.projectname.toLowerCase()) !== -1)
&& (project.clientnr.toLowerCase().indexOf(filterBy.clientnr.toLowerCase()) !== -1)
&& (project.clientname.toLowerCase().indexOf(filterBy.clientname.toLowerCase()) !== -1)
&& (filterBy.statusdesc.indexOf(project.statusdesc) !== -1)) : value;
}

是!有几种方法可以做到这一点,具体取决于您的用例。

  1. 设置_.projects的新值后,您可以手动调用Angular以触发更改检测,如前面的回答所述。虽然这肯定是最容易实现的,但它需要浏览器进行更多的计算,并且可能会导致应用程序速度变慢。

  2. 您可以重构代码,使_.projects本身就是一个承诺,然后使用Angular异步管道来处理更新。这也相对容易,并且在Angular端具有资源密集度较低的优点:

this._projects = this._projectService.getProjectsPromise().then(
function(jsdo, success, request) {
var projects = request.response[HorizonData.dsProjects][HorizonData.dsProjects][HorizonData.ttProjects];
for (let project of projects) {
project.WhenWhoCreatedFull = project.WhenWhoCreated
var whenwho = project.WhenWhoCreated.split(" ");
project.WhenWhoCreated = whenwho[0] + " " + whenwho[2];
}

return projects;
}
)
<tr title="{{ project.INFO }}" *ngFor="let project of (_projects | async) | projectFilter: filtered">

  1. 总体而言,承诺并不是处理反应性数据的最佳方式,因为在它们得到解决后,就无法更新更多数据。虽然这需要比这段代码多得多的重构,但我会研究RxJS——它是一个用于创建Observable的库,Observable是反应式数据流。这对整个代码来说要好得多,所以如果你可以选择重构以使用RxJS,我会的

最新更新