【问题标题】:Angular View not updated after data is back from observable从可观察的数据返回后,角度视图未更新
【发布时间】:2017-10-03 20:34:20
【问题描述】:

AngularJS 1.6 应用程序中,在组件内部,我调用一个可观察对象的订阅,一旦接收到数据,我就初始化一个要在模板中使用的对象。模板是一个简单的表格。

对后端 API 的调用和本地对象的初始化都正确完成,我可以检查日志。但是,当数据可用时,视图不会自行刷新。

只有当我在模板上单击鼠标时,视图才能正确反映数据。

模板

<table class="table light-gray table-no-borders table-condensed">
 <tr>
    <td>
        <span>{{maCtrl.userDetails.lastname}}</span>
    </td>
    <td>
        <span>{{maCtrl.userDetails.firstname}}</span>
    </td>
  </tr>
 <tr>
    ....
 </tr>
</table>

控制器

export class MADetailsController {

public uid: string;
public userDetails: MADetails;

constructor(private currentUserService: IUserService, private maService: MAService) { }

$onInit() {
    if (this.uid) {
        this.currentUserService.getCurrentUser()
            .subscribe(u => {
                this.maService.getPersonDetailsFromSnapshotByUId(this.uid)
                    .then((res: QueryResult<any>) => {

                        let employee = res.data;
                        this.userDetails = new MADetails();

                        this.userDetails.firstname = employee.firstname;
                        this.userDetails.lastname = employee.lastname;

                        //Further initialization...

                    })
            })
    }
  }
}

组件

export class MaDetailsComponent{
static get instance(): IComponentOptions {
    return {
        bindings: {
            uid: "<",
        },
        templateUrl: "./details.html",
        controller: MADetailsController,
        controllerAs: "maCtrl"
    };
  }

}

【问题讨论】:

    标签: angularjs typescript rxjs observable


    【解决方案1】:

    看起来 Angular 不知道数据更改。我不确定 RxJS 是否会触发摘要循环

    只有当我在模板上单击鼠标时,视图才会反映 数据正确。

    通过点击您触发了摘要循环,这就是它起作用的原因。

    您可以通过使用$timeout 包装数据来调用摘要循环:

    $timeout(() => {       
        let employee = res.data;
        this.userDetails = new MADetails();
    
        this.userDetails.firstname = employee.firstname;
        this.userDetails.lastname = employee.lastname;
    }, 0);
    

    希望对你有帮助

    【讨论】:

    • 非常感谢您的回答。事实上,现在它显示正确。我认为 AngularJS 仍然能够“积极地倾听”可观察的变化。
    • @Luca 希望你能找到一些 RXJS 的封装插件
    • $scope.$applyAsync(fn) 会不会更合适?
    猜你喜欢
    • 2018-06-03
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2016-12-26
    • 2018-03-23
    • 2019-04-20
    相关资源
    最近更新 更多