- 98
- 0
场景很简单,调用远程方法,返回的Observable对象的subscribe方法中,(或者Promise的then),更新了数据模型,但是视图没有渲染。
task.component.html
<div class="vertical-form-container">
<form #taskForm>
<mat-form-field>
<input matInput #title type="text" name="title" placeholder="Title" required [(ngModel)]="taskData.title">
</mat-form-field>
<mat-form-field class="example-full-width">
<input matInput #deadlineDate name='deadlineDate' [matDatepicker]="picker" placeholder="Deadline Date" required [(ngModel)]="taskData.deadlineDate">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker touchUi="true" #picker></mat-datepicker>
</mat-form-field>
<mat-form-field class="example-full-width">
<textarea matInput matTextareaAutosize minRows='2' maxRows='10' #description name='description' placeholder="Task Description" [(ngModel)]="taskData.description"></textarea>
</mat-form-field>
<button mat-raised-button color="primary" type="button" (click)='submitTask()'>ADD</button>
</form>
</div>
task.component.ts
......
// taskService是Service,通过taskId远程(非angular的http)获取数据
this.taskService.getTask(taskId).subscribe(
resp=>{
console.log('get task: ----------------');
console.log(resp);
this.taskData = resp; // 场景一,View不更新
// this._ngZone.run(()=>this.taskData = resp); //场景二,使用NgZone,View会更新
/* 场景二,View会更新, changeDetectorRef是注入的ChangeDetectorRef
this.taskData = resp;
this.changeDetectorRef.markForCheck();
this.changeDetectorRef.detectChanges(); */
}
);
......
方式一就无法更新视图,而且如果在方式一中使用router.navigate(...)也会不正常;方式二可以更新视图,但是如果每次都要把回调用ngZone.run()封装起来也太不优雅了;方式三和方式二差不多,而且在angular-material下不正常。
不知道有什么好办法可以解决一下这个问题?还是我哪里写的有问题吗?
1
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
胖元帅 普通会员 1楼
在 Angular 2 中,你可能遇到的问题是,当你在回调函数中更新模型时,视图可能没有正确更新。这可能是由于以下原因:
-
模型没有更新:如果你的模型没有更新,那么即使你改变了它,视图也不会显示新的内容。你可以使用
console.log()或者console.group()来观察模型的状态。 -
更新了视图但没有重新渲染:当你更新了模型并调用
ngAfterViewInit()或者ngAfterContentInit()时,模型可能已经被重新渲染,但视图可能还没有。你可以使用console.log()或者console.group()来观察视图的状态。 -
依赖注入问题:如果你的组件是依赖于其他组件的,那么可能是因为依赖注入的问题导致的。你可以使用
console.log()来观察其他组件的状态。
解决这个问题的方法有很多,但以下是一些可能的解决方案:
-
更新模型:如果你的模型没有更新,那么你需要在
ngAfterViewInit()或者ngAfterContentInit()中更新它。 -
更新视图:你需要确保在更新模型后,视图已经进行了重新渲染。你可以使用
console.log()或者console.group()来观察视图的状态。 -
检查依赖注入:如果你的组件是依赖于其他组件的,那么你需要检查它们是否已经正确地注入了。你可以使用
console.log()来观察其他组件的状态。 -
使用反馈机制:你可以使用
ng反馈来观察视图的状态。当你的视图状态发生变化时,反馈机制会发送一个信号到组件的$emit()方法,你可以使用这个信号来更新视图。
-
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
