账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    @angular2+,在回调函数中更新了模型,但是视图不渲染的问题。
    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 中,你可能遇到的问题是,当你在回调函数中更新模型时,视图可能没有正确更新。这可能是由于以下原因:

      1. 模型没有更新:如果你的模型没有更新,那么即使你改变了它,视图也不会显示新的内容。你可以使用 console.log() 或者 console.group() 来观察模型的状态。

      2. 更新了视图但没有重新渲染:当你更新了模型并调用 ngAfterViewInit() 或者 ngAfterContentInit() 时,模型可能已经被重新渲染,但视图可能还没有。你可以使用 console.log() 或者 console.group() 来观察视图的状态。

      3. 依赖注入问题:如果你的组件是依赖于其他组件的,那么可能是因为依赖注入的问题导致的。你可以使用 console.log() 来观察其他组件的状态。

      解决这个问题的方法有很多,但以下是一些可能的解决方案:

      1. 更新模型:如果你的模型没有更新,那么你需要在 ngAfterViewInit() 或者 ngAfterContentInit() 中更新它。

      2. 更新视图:你需要确保在更新模型后,视图已经进行了重新渲染。你可以使用 console.log() 或者 console.group() 来观察视图的状态。

      3. 检查依赖注入:如果你的组件是依赖于其他组件的,那么你需要检查它们是否已经正确地注入了。你可以使用 console.log() 来观察其他组件的状态。

      4. 使用反馈机制:你可以使用 ng反馈 来观察视图的状态。当你的视图状态发生变化时,反馈机制会发送一个信号到组件的 $emit() 方法,你可以使用这个信号来更新视图。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部