簡體   English   中英

ngOnChanges()沒有在ng2組件中被擊中

[英]ngOnChanges() not getting hit in ng2 component

我有一個具有以下類定義的ng2組件:

import { Component, OnInit, OnChanges, SimpleChanges, Input, NgZone } from '@angular/core';
import { Router } from '@angular/router';
import { SearchService } from '../../services/search.service';

@Component({
    selector: 'search',
    templateUrl: '../../../ng2/templates/search.component.html'
})

export class SearchComponent implements OnInit, OnChanges
{
    @Input() searchMetadata;

    constructor(
        private router: Router,
        private searchService: SearchService,
        public ngZone: NgZone)
    {
    }

    ngOnInit()
    {
        this.getSearchMetadata();
    }

    ngOnChanges(changes: SimpleChanges)
    {
        alert('ngOnChanges entered');
    }

    getSearchMetadata()
    {
        this.searchService
            .getSearchMetadata()
            .then(this.processSearchMetadata.bind(this))
            .then(this.validateVariableSet.bind(this))
            .then(responseObject => this.blogSearchMetadata = "TEST");
    }

    processSearchMetadata(responseObject)
    {
        this.searchMetadata = Object.assign(new SearchMetadata(), responseObject)
    }

    validateVariableSet()
    {
        alert(this.searchMetadata);
    }
}

最后的validateVariableSet()函數將驗證成員變量是否按預期設置。 它成功警告該值。 但是,ngOnChanges()不會被點擊。 我的理解是,任何標有@Input()的變量都會在該變量的值更改后觸發ngOnChanges事件。 知道可能存在什么差距嗎?

更新1

這是一個簡單的模板html。 我的目標只是獲取ddlTest的句柄,但直到* ngIf(searchMetadata)實現之前,我無法這樣做。 根據先前的研究,使用ngOnChanges()掛鈎似乎是實現此目的的最佳方法,但我願意提出更合適的解決方案的建議

<router-outlet>
    [{{searchMetadata}}]
    <div *ngIf="searchMetadata">
         <select id="ddlTest">
             <option>1</option>
             <option>2</option>
             <option>3</option>
    </select>
    </div>
 </router-outlet>

更新2

以下方法有效。 簡單而直接。 這很hacky,但是可以用。 當addJQueryHook()被命中時,上面的ddlTest將已經被渲染。 如果您知道更好的方法,請lmk!

<div *ngIf="SearchMetadata">
    <select id="ddlTest">
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    <div *ngIf="addJQueryHook()">
    </div>
</div>

好的,評論太小而無法給出答案。

這種綁定和ngOnChanges工作方式是這樣的...

您有一些組件,可以稱之為ContainerComponent 例如,在該模板中,您可以使用如下search組件:

<search [searchMetadata]="somePropertyOnYourContainerComponent">

這會將您的search組件@Input() searchMetadatasomePropertyOnYourContainerComponent並且您的ngOnChanges將觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM