diff --git a/src/app/formulaire/definition/form-courbe-remous.ts b/src/app/formulaire/definition/form-courbe-remous.ts
index 304fef0ba260451543d63aea3d0a314bbe2efc6d..3762c846cb3fd3c5a11a21d850746f0a024c9074 100644
--- a/src/app/formulaire/definition/form-courbe-remous.ts
+++ b/src/app/formulaire/definition/form-courbe-remous.ts
@@ -16,6 +16,7 @@ export class FormulaireCourbeRemous extends FormulaireSection {
     constructor() {
         super();
         this._remousResults = new RemousResults(this);
+        this.updateCalcResults();
         this._props["varCalc"] = ""; // important
     }
 
@@ -27,43 +28,44 @@ export class FormulaireCourbeRemous extends FormulaireSection {
         const cr: CourbeRemous = this.currentNub as CourbeRemous;
         const prmCR: CourbeRemousParams = cr.prms as CourbeRemousParams;
 
-        this.remousResults.parameters = prmCR;
+        this._remousResults.parameters = prmCR;
 
         // variable supplémentaire à calculer
-        this.remousResults.extraParamSymbol = this.currentNub.properties.getPropValue("varCalc");
+        this._remousResults.extraParamSymbol = this.currentNub.properties.getPropValue("varCalc");
 
         // calcul
-        this.remousResults.result = cr.CalcSerie();
+        this._remousResults.result = cr.CalcSerie();
 
         const sect: acSection = cr.Sn;
         this.resultYn = sect.CalcSection("Yn"); // hauteur normale
         this.resultYc = sect.CalcSection("Yc"); // hauteur critique
 
         // données du graphique
-        this.remousResults.hauteurNormale = this.resultYn.resultElement;
-        this.remousResults.hauteurCritique = this.resultYc.resultElement;
-        if (this.remousResults.extraParamSymbol) {
-            this.remousResults.extraChart = ! ["Hs", "Hsc", "Ycor", "Ycon"].includes(this.remousResults.extraParamSymbol);
+        this._remousResults.hauteurNormale = this.resultYn.resultElement;
+        this._remousResults.hauteurCritique = this.resultYc.resultElement;
+        if (this._remousResults.extraParamSymbol) {
+            this._remousResults.extraChart = !["Hs", "Hsc", "Ycor", "Ycon"].includes(this._remousResults.extraParamSymbol);
         } else {
-            this.remousResults.extraChart = false;
+            this._remousResults.extraChart = false;
         }
+        this.updateCalcResults();
     }
 
-    public get remousResults() {
-        return this._remousResults;
+    protected updateCalcResults() {
+        this._calcResults = [];
+        if (this._remousResults) {
+            // ensure help links are propagated
+            this._remousResults.helpLinks = this.helpLinks;
+            this._calcResults.push(this._remousResults);
+        }
     }
 
     public resetFormResults() {
         this._remousResults.reset();
+        this.updateCalcResults();
     }
 
     public get hasResults(): boolean {
         return this._remousResults.hasResults;
     }
-
-    public get results(): CalculatorResults[] {
-        // ensure help links are propagated
-        this._remousResults.helpLinks = this.helpLinks;
-        return [ this._remousResults ];
-    }
 }
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index 3fd3ee3a274ab1fedb90e0ae8b2c166701210aea..bacf4f4d1ee97117db288b0ac8188008fc68b6ca 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -56,6 +56,15 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
     /** copy of options.resultsHelp read by FormDefinition.parseOptions() */
     public helpLinks: { [key: string]: string };
 
+    /*
+    * Propriété destinée à éviter des MAJ intempestives par Angular : avant, le getter public get results()
+    * recréait à chaque appel un tableau CalculatorResults[], ce qui était détecté par Angular
+    * comme un changement même si les résultats stockés dans le tableau n'étaient pas modifiés.
+    *  A présent, _calcResults n'est recréé que si les resultats sont modifiés
+    *  (cf. updateCalcResults()).
+    */
+    protected _calcResults: CalculatorResults[];
+
     constructor(parent?: FormulaireNode) {
         super(parent);
     }
@@ -435,12 +444,23 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
 
     public abstract get hasResults(): boolean;
 
-    public abstract get results(): CalculatorResults[];
+    public get results(): CalculatorResults[] {
+        return this._calcResults;
+    }
+
+    /**
+     * Recrée l'objet retourné par public get results() et
+     * évite des mises à jour par Angular dues à un une détection
+     * de changement causée par le fait que get results() recréait
+     * systématiquement un CalculatorResults[]
+     */
+    protected abstract updateCalcResults();
 
     /**
      * Copies current Nub result into result components for display on page.
      * Should be called every time the Nub result changes.
      * Must be idempotent.
+     * Must call updateCalcResults() at the end.
      */
     protected abstract reaffectResultComponents();
 
diff --git a/src/app/formulaire/definition/form-fixedvar.ts b/src/app/formulaire/definition/form-fixedvar.ts
index 7b596ffbf07e355a534a3298fc67bdb6a641b07c..575f7cb100cff6c9f2a3061ce3c27f2812f9e747 100644
--- a/src/app/formulaire/definition/form-fixedvar.ts
+++ b/src/app/formulaire/definition/form-fixedvar.ts
@@ -25,16 +25,13 @@ export class FormulaireFixedVar extends FormulaireDefinition {
         super(parent);
         this._fixedResults = new FixedResults();
         this._varResults = new VarResults(this);
+        this.updateCalcResults();
     }
 
     public get fixedResults() {
         return this._fixedResults;
     }
 
-    public get varResults() {
-        return this._varResults;
-    }
-
     public get selectids(): string[] {
         return this._selectIds;
     }
@@ -42,9 +39,10 @@ export class FormulaireFixedVar extends FormulaireDefinition {
     public resetFormResults() {
         this._fixedResults.reset();
         this._varResults.reset();
+        this.updateCalcResults();
     }
 
-    public addFixedParameters() {
+    protected addFixedParameters() {
         for (const p of this.getFixedParameters()) {
             this._fixedResults.addFixedParameter(p);
         }
@@ -52,20 +50,26 @@ export class FormulaireFixedVar extends FormulaireDefinition {
 
     public set chartType(t: ChartType) {
         this._varResults.chartType = t;
+        this.updateCalcResults();
     }
 
     public get hasResults(): boolean {
         return this._fixedResults.hasResults || this._varResults.hasResults;
     }
 
-    public get results(): CalculatorResults[] {
-        const res: CalculatorResults[] = [];
+    /**
+     * Recrée l'objet retourné par public get results() et
+     * évite des mises à jour par Angular dues à un une détection
+     * de changement causée par le fait que get results() recréait
+     * systématiquement un CalculatorResults[]
+     */
+    protected updateCalcResults() {
+        this._calcResults = [];
         // ensure help links are propagated
         this._fixedResults.helpLinks = this.helpLinks;
         this._varResults.helpLinks = this.helpLinks;
-        res.push(this._fixedResults);
-        res.push(this._varResults);
-        return res;
+        this._calcResults.push(this._fixedResults);
+        this._calcResults.push(this._varResults);
     }
 
     public afterParseFieldset(fs: FieldSet) {
@@ -120,20 +124,21 @@ export class FormulaireFixedVar extends FormulaireDefinition {
 
         if (varParams.length === 0) {
             // pas de paramètre à varier
-            this.fixedResults.result = nub.result;
+            this._fixedResults.result = nub.result;
             if (computedParam !== undefined) {
-                this.fixedResults.calculatedParameter = computedParam;
+                this._fixedResults.calculatedParameter = computedParam;
             }
         } else {
             // il y a un paramètre à varier
-            this.varResults.variatedParameters = varParams;
+            this._varResults.variatedParameters = varParams;
             if (computedParam !== undefined) {
-                this.varResults.calculatedParameter = computedParam;
+                this._varResults.calculatedParameter = computedParam;
             }
 
-            this.varResults.result = nub.result;
-            this.varResults.update();
+            this._varResults.result = nub.result;
+            this._varResults.update();
         }
+        this.updateCalcResults();
     }
 
     /**
diff --git a/src/app/formulaire/definition/form-macrorugo-compound.ts b/src/app/formulaire/definition/form-macrorugo-compound.ts
index a8cbc7ac605ee477cc3a4bbdfa10e6744b7bdf18..b28b59b7d21e335b8605e9d7b84ce1851eb4836d 100644
--- a/src/app/formulaire/definition/form-macrorugo-compound.ts
+++ b/src/app/formulaire/definition/form-macrorugo-compound.ts
@@ -18,6 +18,7 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset {
     constructor() {
         super();
         this._mrcResults = new MacrorugoCompoundResults();
+        this.updateCalcResults();
         // default properties
         this._props["inclinedApron"] = MRCInclination.NOT_INCLINED;
     }
@@ -119,18 +120,18 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset {
         const varParams: VariatedDetails[] = this.getVariatedParameters();
 
         // résultat de calcul de la passe à macrorugo complexe
-        const mrcr = this.mrcResults;
-        mrcr.calculatedParameter = computedParam;
-        mrcr.result = mrc.result;
+        this._mrcResults.calculatedParameter = computedParam;
+        this._mrcResults.result = mrc.result;
         if (varParams) {
-            mrcr.variatedParameters = varParams;
+            this._mrcResults.variatedParameters = varParams;
         }
         // résultat de chaque enfant
         const cr: Result[] = [];
         for (const c of mrc.children) {
             cr.push(c.result);
         }
-        mrcr.childrenResults = cr;
+        this._mrcResults.childrenResults = cr;
+        this.updateCalcResults();
     }
 
     public get mrcResults() {
@@ -139,12 +140,16 @@ export class FormulaireMacrorugoCompound extends FormulaireRepeatableFieldset {
 
     public resetFormResults() {
         this._mrcResults.reset();
+        this.updateCalcResults();
     }
 
-    public get results(): CalculatorResults[] {
-        // ensure help links are propagated
-        this._mrcResults.helpLinks = this.helpLinks;
-        return [ this._mrcResults ];
+    protected updateCalcResults() {
+        this._calcResults = [];
+        if (this._mrcResults) {
+            // ensure help links are propagated
+            this._mrcResults.helpLinks = this.helpLinks;
+            this._calcResults.push(this._mrcResults);
+        }
     }
 
     public get hasResults(): boolean {
diff --git a/src/app/formulaire/definition/form-pab.ts b/src/app/formulaire/definition/form-pab.ts
index af9b7f56d9ea67134a0d682678477961df20f646..b82eea4549cd409a9587cfaaad52f0acc9badc96 100644
--- a/src/app/formulaire/definition/form-pab.ts
+++ b/src/app/formulaire/definition/form-pab.ts
@@ -17,6 +17,7 @@ export class FormulairePab extends FormulaireDefinition {
     constructor() {
         super();
         this._pabResults = new PabResults();
+        this.updateCalcResults();
     }
 
     public get pabNub(): Pab {
@@ -38,21 +39,20 @@ export class FormulairePab extends FormulaireDefinition {
         const varParams: VariatedDetails[] = this.getVariatedParameters();
 
         // résultat de calcul de la passe à bassins
-        const pabr = this.pabResults;
-        pabr.calculatedParameter = computedParam;
-        pabr.result = pab.result;
+        this._pabResults.calculatedParameter = computedParam;
+        this._pabResults.result = pab.result;
 
         // résultat de chaque cloison
         const cr: Result[] = [];
         for (const c of pab.children) {
             cr.push(c.result);
         }
-        pabr.cloisonsResults = cr;
+        this._pabResults.cloisonsResults = cr;
         // résultat de la cloison aval
-        pabr.cloisonAvalResults = pab.downWall.result;
+        this._pabResults.cloisonAvalResults = pab.downWall.result;
 
         // cote aval de la passe
-        pabr.Z2 = [];
+        this._pabResults.Z2 = [];
         if (varParams.length > 0) {
             // find longest list
             const lvp = longestVarParam(varParams);
@@ -62,20 +62,22 @@ export class FormulairePab extends FormulaireDefinition {
                 const iter = pab.prms.Z2.getExtendedValuesIterator(longest);
                 while (iter.hasNext) {
                     const nv = iter.next();
-                    pabr.Z2.push(nv.value);
+                    this._pabResults.Z2.push(nv.value);
                 }
             } else {
                 for (let i = 0; i < longest; i++) {
-                    pabr.Z2.push(pab.prms.Z2.v);
+                    this._pabResults.Z2.push(pab.prms.Z2.v);
                 }
             }
         } else {
-            pabr.Z2 = [ pab.prms.Z2.singleValue ];
+            this._pabResults.Z2 = [pab.prms.Z2.singleValue];
         }
 
         if (varParams) {
-            pabr.variatedParameters = varParams;
+            this._pabResults.variatedParameters = varParams;
         }
+
+        this.updateCalcResults();
     }
 
     public get pabResults() {
@@ -84,12 +86,16 @@ export class FormulairePab extends FormulaireDefinition {
 
     public resetFormResults() {
         this._pabResults.reset();
+        this.updateCalcResults();
     }
 
-    public get results(): CalculatorResults[] {
-        // ensure help links are propagated
-        this._pabResults.helpLinks = this.helpLinks;
-        return [ this._pabResults ];
+    protected updateCalcResults() {
+        this._calcResults = [];
+        if (this._pabResults) {
+            // ensure help links are propagated
+            this._pabResults.helpLinks = this.helpLinks;
+            this._calcResults.push(this._pabResults);
+        }
     }
 
     public get hasResults(): boolean {
diff --git a/src/app/formulaire/definition/form-prebarrage.ts b/src/app/formulaire/definition/form-prebarrage.ts
index 993a72e8b5fe00c3daf93888ba338a5fa12c73e2..8f317caba59b6b5218a157daccf1b6cc6ffd2884 100644
--- a/src/app/formulaire/definition/form-prebarrage.ts
+++ b/src/app/formulaire/definition/form-prebarrage.ts
@@ -42,6 +42,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
     constructor() {
         super();
         this._pbResults = new PrebarrageResults();
+        this.updateCalcResults();
         this._pbResults.addObserver(this);
     }
 
@@ -53,10 +54,13 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         return this._pbResults;
     }
 
-    public get results(): CalculatorResults[] {
-        // ensure help links are propagated
-        this._pbResults.helpLinks = this.helpLinks;
-        return [this._pbResults];
+    protected updateCalcResults() {
+        this._calcResults = [];
+        if (this._pbResults) {
+            // ensure help links are propagated
+            this._pbResults.helpLinks = this.helpLinks;
+            this._calcResults.push(this._pbResults);
+        }
     }
 
     public get hasResults(): boolean {
@@ -219,8 +223,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         this.runNubCalc(this.currentNub);
         this.refreshFieldsets(); // important: before reaffectResultComponents() or it will break results components localization
         // reset variable index to avoid trying to access an index > 0 when nothing varies
-        const pbr = this.pbResults;
-        pbr.variableIndex = 0;
+        this._pbResults.variableIndex = 0;
 
         this.reaffectResultComponents();
         this.refreshSchema();
@@ -231,39 +234,41 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         const computedParam: NgParameter = this.getComputedParameter();
 
         // cacher les résultats
-        this.pbResults.reset();
+        this._pbResults.reset();
         this.addFixedParameters();
 
         // pour le sélecteur d'itérations
         const varParams: VariatedDetails[] = this.getVariatedParameters();
         if (varParams) {
-            this.pbResults.variatedParameters = varParams;
+            this._pbResults.variatedParameters = varParams;
             const lvp = longestVarParam(this._pbResults.variatedParameters);
             this._pbResults.size = lvp.size;
             this._pbResults.cloisonResults.size = lvp.size;
         }
 
-        this.pbResults.result = pb.result;
+        this._pbResults.result = pb.result;
         // résultats selon l'objet sélectionné sur le schéma
         if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
             // afficher les résultats de cloison
-            this.pbResults.cloisonResults.result = this._selectedItem.result;
+            this._pbResults.cloisonResults.result = this._selectedItem.result;
             if (computedParam !== undefined) {
-                this.pbResults.cloisonResults.calculatedParameter = computedParam;
+                this._pbResults.cloisonResults.calculatedParameter = computedParam;
             }
             // transmission des suffixes de cloisons calculés par l'algo de tri de PbSchemaComponent,
             // pour le sélecteur de conditions limites
             const pbs = this.kids[0] as PbSchema;
-            this.pbResults.wallsSuffixes = pbs.wallsSuffixes;
+            this._pbResults.wallsSuffixes = pbs.wallsSuffixes;
         } else {
             // afficher les résultats des bassins
             // résultat général du Nub (amont, aval, débit)
-            this.pbResults.calculatedParameter = computedParam;
+            this._pbResults.calculatedParameter = computedParam;
             // résultat de chaque bassin
             for (const b of pb.bassins) {
-                this.pbResults.bassinsResults.push(b.result);
+                this._pbResults.bassinsResults.push(b.result);
             }
         }
+
+        this.updateCalcResults();
     }
 
     /**
@@ -282,7 +287,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
         }
     }
 
-    public addFixedParameters() {
+    protected addFixedParameters() {
         if (this._selectedItem !== undefined && this._selectedItem instanceof PbCloison) {
             for (const s of this._selectedItem.structures) {
                 for (const p of s.parameterIterator) {
@@ -300,6 +305,7 @@ export class FormulairePrebarrage extends FormulaireFixedVar {
 
     public resetFormResults() {
         this._pbResults.reset();
+        this.updateCalcResults();
     }
 
     public resetResults() {
diff --git a/src/app/formulaire/definition/form-section-parametree.ts b/src/app/formulaire/definition/form-section-parametree.ts
index 743880b5da19f5ae0542af1402223df2537a29db..7f91f2fca963c76ba3e5bae49cfa8adc511afa8b 100644
--- a/src/app/formulaire/definition/form-section-parametree.ts
+++ b/src/app/formulaire/definition/form-section-parametree.ts
@@ -15,6 +15,7 @@ export class FormulaireSectionParametree extends FormulaireSection {
     public constructor() {
         super();
         this._sectionResults = new SectionResults();
+        this.updateCalcResults();
     }
 
     protected compute() {
@@ -43,15 +44,16 @@ export class FormulaireSectionParametree extends FormulaireSection {
             this._sectionResults.result = sectNub.result;
             // résultats complémentaires des paramètres fixés
             this.addFixedParameters();
-            this.fixedResults.result = sectNub.result;
+            this._fixedResults.result = sectNub.result;
         }
-
+        this.updateCalcResults();
     }
 
     public resetFormResults() {
         this._fixedResults.reset();
         this._varResults.reset();
         this._sectionResults.reset();
+        this.updateCalcResults();
     }
 
     public get hasResults(): boolean {
@@ -60,15 +62,16 @@ export class FormulaireSectionParametree extends FormulaireSection {
             || (this._sectionResults?.hasResults);
     }
 
-    public get results(): CalculatorResults[] {
-        const res: CalculatorResults[] = [];
+    protected updateCalcResults() {
+        this._calcResults = [];
         // ensure help links are propagated
         this._fixedResults.helpLinks = this.helpLinks;
         this._varResults.helpLinks = this.helpLinks;
-        this._sectionResults.helpLinks = this.helpLinks;
-        res.push(this._fixedResults);
-        res.push(this._varResults);
-        res.push(this._sectionResults);
-        return res;
+        this._calcResults.push(this._fixedResults);
+        this._calcResults.push(this._varResults);
+        if(this._sectionResults){
+            this._sectionResults.helpLinks = this.helpLinks;
+            this._calcResults.push(this._sectionResults);
+        }
     }
 }
diff --git a/src/app/formulaire/definition/form-verificateur.ts b/src/app/formulaire/definition/form-verificateur.ts
index b357c4a0de658da92bac30bb62669bdd13caeb67..3bcd463a65b77779aea4aa3ba7875ddae91adcac 100644
--- a/src/app/formulaire/definition/form-verificateur.ts
+++ b/src/app/formulaire/definition/form-verificateur.ts
@@ -16,6 +16,7 @@ export class FormulaireVerificateur extends FormulaireFixedVar {
     constructor() {
         super();
         this._verificateurResults = new VerificateurResults();
+        this.updateCalcResults();
     }
 
     public get verificateurNub(): Verificateur {
@@ -59,14 +60,17 @@ export class FormulaireVerificateur extends FormulaireFixedVar {
             er.push(sp.result);
         }
         vr.especeResults = er;
-    }
 
+        this.updateCalcResults();
+    }
+    
     public resetFormResults() {
         this._verificateurResults.reset();
+        this.updateCalcResults();
     }
 
-    public get results(): CalculatorResults[] {
-        return [ this._verificateurResults ];
+    protected updateCalcResults() {
+        this._calcResults = [this._verificateurResults];
     }
 
     public get hasResults(): boolean {