2017-01-30 1 views
-2

Ich habe Winkel 1.5 Komponente innerhalb HTML-Seite (nicht übergeordnete Komponente) und die Komponente wird nicht mehr als $ onChanges bei Änderung aufrufen: ist hier die mit HTML: . . .

<my-comp standards-data="standardsData"></my-comp> 

. . .

hier ist die Komponente:

angular.module("bla").component('myComp', { 
    templateUrl: '/my-comp.tpl.html', 
    controller: myController, 
    bindings: { 
     standardsData: '<' 
    } 
}); 

function myController() { 
    var self = this; 

    self.$onInit = function() { 
     self.standardsData = {}; 
    } 

    self.$onChanges = function (changes) { 
     self.standardsData.something = changes.standardsData.currentValue.something; 
    }; 
} 

Wenn ich neue Daten in der Abfrage des HTML holen, die meine Komponente enthält, es wird die Komponente nicht beeinflussen. Ich bekomme nur in die $ onInit der Komponente und nach $ scope.standardsData Änderungen (in der enthaltenen html/ctrl), die $ OnChanges meiner Komponente wird nicht aufrufen.

Ich hoffe, ich habe das Problem richtig beschrieben, Danke!

Antwort

2

Die Bindung Ihrer Komponente an standardsData ist eine Bindung an eine Objektreferenz, die sich auch dann nicht ändert, wenn eine ihrer Eigenschaften geändert wird. Daher wird $onChanges nicht ausgelöst. Dies liegt an der Tatsache, dass $onChanges eine flache $watch verwendet.

Mit anderen Worten: $onChanges nur dann ausgelöst wird, wenn wir Primitive verwenden (dh nicht-Objekte) oder die Referenz des Javascript-Objekt ändern in die Komponente

So müssen Sie verpflichtet, entweder: 1) Binden Sie manuell an die gewünschte Eigenschaft/Eigenschaften und nicht an die Objektreferenz, oder 2) Ändern Sie das gesamte standardsData Objekt, wenn sich seine Daten ändern. Sie könnten auch 3) Neuschreiben $onChanges Funktionalität, nehme ich an (nicht empfohlen).

Option 1:

Verwenden nur auf die Eigenschaft Bind wenn die übergeordnete Steuereinheit/Komponente lediglich eine Eigenschaft oder Eigenschaften ändert.

<my-comp standards-data-something="standardsData.something"></my-comp> 

und

bindings: { 
    standardsDataSomething: '<' 
} 

Option 2: Ändern der Referenz

Verwenden, wenn die übergeordnete Steuereinheit/Komponente vollständig neue standardsData erhält. Sie würden Ihren aktuellen HTML-Code für diese Option beibehalten und festlegen:

standardsData = {newData}; //Reset the new data from http or wherever 

, um die Referenz zu ändern.


Einige weitere lesen Sie interessant finden:

http://blog.kwintenp.com/the-onchanges-lifecycle-hook/

http://www.codelord.net/2016/12/20/replacing-angulars-deep-watches-with-the-%24docheck-lifecycle-hook/

+0

Vielen Dank für Ihre Antwort! Eigentlich glaube ich nicht, weil StandardsData ein Objekt ist. Es gibt 2 Fälle in der Anwendung: 1. Wir klicken auf einen Link und Routing in diesem Bildschirm. Wenn Sie dies tun, gibt es keine Aktivität im OnChanges-Ereignis. (nur onInit) ... 2. Wenn ich die Seite aktualisiere (wie F5), beginnt das onChanges Ereignis in Aktion zu treten. keine Idee? Danke! – moshi

+0

@moshi - Zwei Dinge bewirken, dass '$ onChanges' ausgelöst wird: 1) Wenn die Komponente zuerst initialisiert wird, 2) wenn Änderungen an einer Bindung vom Elternteil vorgenommen werden. Die F5-Aktualisierung bewirkt, dass Sie die Änderungsaktivität von der Initialisierung sehen. Sie sehen es nie wieder, weil Sie an eine Objektreferenz gebunden haben, die sich nicht ändert. Ich werde meine (richtige) Antwort löschen, wenn Sie möchten. – sh0ber

+0

Vielen Dank für Ihre Antwort. Ich stimme Ihnen zu, dass $ onChanges bei der Initialisierung auftritt. Ich sehe nicht, dass es immer bei Datenänderungen auftritt. Es ist wie wenn ich die Seite aktualisieren und klicken Sie auf die Menüpunkte (die jeder von ihnen lädt neue Daten für diese Komponente) - jede Sache geht gut. Für jeden Klick - die $ onChanges passiert. ABER - wenn ich auf eine andere Seite gehen und klicken Sie dort auf einen Link zu meiner Seite (die Seite, die die Komponente enthält), meine Komponente $ onChanges wird nicht ausgelöst, obwohl ich die Daten zu aktualisieren. Dann, egal, jedes Menü klicke ich - es wird $ onChanges auf meiner Komponente nicht verursachen. – moshi

Verwandte Themen