【问题标题】:Angular track object property changes角度轨道对象属性更改
【发布时间】:2018-09-11 17:28:03
【问题描述】:

我正在从 api 服务中检索对象值并显示在 html 元素中以允许用于对 page 属性进行任何更改 这将是双向数据绑定,所以我想检查page 属性中是否检测到任何更改。这是一个场景。

这是我的组件:

  export class TestComponent implements OnInit{

  page:any = {};
  changesSaved:boolean = false;

  constructor(
    private route:ActivatedRoute
  ) { 
      this.route.params.subscribe(params=>{
        this.currentParam = params.id;
        params.id? this.onGetPageSettings(params.id): false;
      })
  }

  ngOnInit() {

  }

  onGetPageSettings(id){
    this.configureService.getPageSettings(id)
      .subscribe((response:any)=>{
        let pageConfig = response.data;
        this.page.attrib1 =  pageConfig.page_id;
        this.page.attrib2 =  pageConfig.page_name;
        this.page.attrib3 =  pageConfig.page_desc;
      },error=>{
        console.log(error)
      })
  }

}

这是一个html代码,我正在使用ui开关进行选项更改

<form role="form">
    <div class="form-body">
        <div class="form-group form-md-line-input">
            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'AUTO_LIKE_COMMENT' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.page_like_comment" name="page_like_comment" [(ngModel)]="page.page_like_comment"></ui-switch>
            </div>
        </div>

        <div class="form-group form-md-line-input">

            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'AUTO_REPLY_COMMENT_WITH_COMMENT' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.page_reply_comment" name="page_reply_comment" [(ngModel)]="page.page_reply_comment"></ui-switch>
            </div>
        </div>

        <div class="form-group form-md-line-input">

            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'AUTO_REPLY_COMMENT_WITH_PRIVATE_MESSAGE' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.page_reply_comment_with_message" name="page_reply_comment_with_message" [(ngModel)]="page.page_reply_comment_with_message"></ui-switch>
            </div>
        </div>


        <div class="form-group form-md-line-input">

            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'AUTO_INBOX_MESSAGING' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.page_reply_message" name="page_reply_message" [(ngModel)]="page.page_reply_message"></ui-switch>
            </div>
        </div>
        <div class="form-group form-md-line-input">

            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'SELF_LEARNING_AI' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.include_comment_text_in_message" name="include_comment_text_in_message" [(ngModel)]="page.include_comment_text_in_message"></ui-switch>
            </div>
        </div>
        <div class="form-group form-md-line-input">
            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'IGNORE_TAG_FRIEND_COMMENT' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.ignore_tag_comment" name="ignore_tag_comment" [(ngModel)]="page.ignore_tag_comment"></ui-switch>
            </div>
        </div>


        <div class="form-group form-md-line-input">

            <label class="col-lg-7 col-md-7 col-sm-7 col-xs-7 control-label">{{ 'IGNORE_STICKER_COMMENT' | translate }}</label>
            <div class="col-lg-5 col-md-5 col-sm-5 col-xs-5">
                <ui-switch [checked]="page.ignore_sticker_comment" name="ignore_sticker_comment" [(ngModel)]="page.ignore_sticker_comment"></ui-switch>
            </div>
        </div>

    </div>

</form>

我知道 ngModelChange 会完成这项工作,但我想要一种通用的方式,这样我就不必对每个输入元素都应用。

就像下面的 html 代码一样,我也使用自定义指令来允许用户在数组中输入信息,然后将此信息附加到 page 属性中。

<div token-field name="comment" [value]="page.page_default_comment" (tokenAdded)="addDefaultComment($event)" heading="Add Comment" addButtonLabel="Add Comment"></div>

【问题讨论】:

  • 你没有提到你面临的问题是什么,你还需要添加html代码。
  • 如果您通过双重绑定直接改变对象,则无法直接跟踪更改的属性。您要么代理另一个对象,要么将创建这些更改的 UI 事件绑定到组件中的某些逻辑。
  • 有什么方法可以像我们通常在 angular1 "$watch" 中使用的那样使用属性吗?
  • @IrfanMuhammad 您可以使用 (ngModelChange)="yourFunctionHere()" 检测模型更改
  • @CassianoMontanari 是的,我知道 ngModelChange 可以完成这项工作,但我想要一种通用的方式,这样我就不必对每个输入元素都应用了。

标签: angular typescript angular-components


【解决方案1】:

理想的方法是将以前的值存储在 var 中并使用 NgModel 进行比较。

但是当您要求检测变化的通用方法时,

您可以在组件中使用 OnChange 事件。

https://angular.io/api/core/OnChanges

ngOnChanges 方法中,如果字段的值发生变化,您可以通过将初始值存储在其他变量中并在ngOnChanges() 中进行比较来编写规则

此外,您也可以检查一下。

https://angular.io/api/core/ChangeDetectorRef

【讨论】:

  • ChangeDetectorRef 仅用于手动强制角度来检测更改而不是获取更改元数据。 ngOnChanges 也仅适用于 @Input@Output,不适用于所有变量。
猜你喜欢
  • 2016-09-05
  • 2018-12-30
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2020-11-03
  • 2019-08-08
相关资源
最近更新 更多