typescript Angular 组件仅在移动鼠标后更新视图中的变量

jrcvhitl  于 2022-12-30  发布在  TypeScript
关注(0)|答案(3)|浏览(167)

∮问题是
我有一个订阅Observable的组件,只有当我将鼠标移到浏览器窗口上时,myValue的值才会在模板中更新。
最奇怪的是两个console.log工作正常。

  • 我重新加载页面,保持鼠标静止
  • 我可以在控制台中看到更新后的值
  • 模板仍显示"defaultValue"值
  • 我移动鼠标,模板显示我已经在控制台中看到的更新值。

我设法使它与ChangeDetectorRef.detectChanges()一起工作,但当您不知道问题在哪里时,它似乎与在AngularJS中使用$scope.apply()一样错误。

我的组件.组件. ts

import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';

import { HelperService } from 'path';

@Component({
    selector: 'my-selector',
    templateUrl: 'my-component.component.html'
})
export class MyComponent implements OnDestroy, OnInit {
    myValue: string;

    private subscription: Subscription;

    constructor(
        private helperService: HelperService
    ) {
        //
    }

    ngOnInit() {
        this.myValue = 'defaultValue';

        this.subscription = this.helperService.getNewValue$().subscribe((newValue) => {
            console.log('pre', this.myValue);
            this.myValue = newValue;
            console.log('post', this.myValue);
        });
    }

    ngOnDestroy() {
        if (this.subscription !== undefined ) {
            this.subscription.unsubscribe();
        }
    }
}

助手.服务. ts

getNewValue$(): Observable<string> {
        return Observable.fromPromise(this.methodCallingAThirdPartyLibrary());
    }

我的组件.组件. html

debug: {{ myValue }}
8cdiaqws

8cdiaqws1#

这里有一个有趣的观点:https://stackoverflow.com/a/41241646/1030207
this.methodCallingAThirdPartyLibrary()正在返回调用第三方库的方法所返回的Promise,因此可能一切都发生在Angular的控制之外。
明天早上(这里是23:44),我将尝试将内部调用打包到zone.run

dz6r00yl

dz6r00yl2#

由于我无法实现您的服务,我已经完成了以下代码,以使用ngDoCheck和ChangeDetectionStrategy记录组件发生的任何更改,如下所示

import {Component, NgModule ,ChangeDetectionStrategy,ngDoCheck} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser'
import {FormsModule} from '@angular/forms';
@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
        <input [(ngModel)]="someValue" />
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class App implements ngDoCheck {
  someValue:any;
  name:string;
  constructor() {
    this.name = 'Welcome to Change Detection Demo'
  }
  ngDoCheck(){
    console.log(this.someValue);

    }
}

我使用了一个文本框来检测组件中的更改。

**一个

t98cgbkg

t98cgbkg3#

你应该改变你的组件的检测策略。我有一个类似的案例,解决我的问题是把add changeDetection变量设置为Default而不是OnPush。如下所示。

@Component({
    selector   : 'mycomponent',
    templateUrl: './mycomponent.html',
    changeDetection: ChangeDetectionStrategy.Default
})

相关问题