Don't try to unsubscribe from fixed cascading parameters. Fixes #11653
This commit is contained in:
parent
de91125593
commit
1b6f721648
|
|
@ -165,7 +165,11 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
var numCascadingParameters = _cascadingParameters.Count;
|
var numCascadingParameters = _cascadingParameters.Count;
|
||||||
for (var i = 0; i < numCascadingParameters; i++)
|
for (var i = 0; i < numCascadingParameters; i++)
|
||||||
{
|
{
|
||||||
_cascadingParameters[i].ValueSupplier.Unsubscribe(this);
|
var supplier = _cascadingParameters[i].ValueSupplier;
|
||||||
|
if (!supplier.CurrentValueIsFixed)
|
||||||
|
{
|
||||||
|
supplier.Unsubscribe(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -188,16 +188,25 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
var renderer = new TestRenderer();
|
var renderer = new TestRenderer();
|
||||||
var component = new TestComponent(builder =>
|
var component = new TestComponent(builder =>
|
||||||
{
|
{
|
||||||
builder.OpenComponent<CascadingValue<string>>(0);
|
// At the outer level, have an unrelated fixed cascading value to show we can deal with combining both types
|
||||||
builder.AddAttribute(1, "Value", providedValue);
|
builder.OpenComponent<CascadingValue<int>>(0);
|
||||||
builder.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(childBuilder =>
|
builder.AddAttribute(1, "Value", 123);
|
||||||
|
builder.AddAttribute(2, "IsFixed", true);
|
||||||
|
builder.AddAttribute(3, RenderTreeBuilder.ChildContent, new RenderFragment(builder2 =>
|
||||||
{
|
{
|
||||||
if (displayNestedComponent)
|
// Then also have a non-fixed cascading value so we can show that unsubscription works
|
||||||
|
builder2.OpenComponent<CascadingValue<string>>(0);
|
||||||
|
builder2.AddAttribute(1, "Value", providedValue);
|
||||||
|
builder2.AddAttribute(2, RenderTreeBuilder.ChildContent, new RenderFragment(builder3 =>
|
||||||
{
|
{
|
||||||
childBuilder.OpenComponent<CascadingParameterConsumerComponent<string>>(0);
|
if (displayNestedComponent)
|
||||||
childBuilder.AddAttribute(1, "RegularParameter", "Goodbye");
|
{
|
||||||
childBuilder.CloseComponent();
|
builder3.OpenComponent<SecondCascadingParameterConsumerComponent<string, int>>(0);
|
||||||
}
|
builder3.AddAttribute(1, "RegularParameter", "Goodbye");
|
||||||
|
builder3.CloseComponent();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
builder2.CloseComponent();
|
||||||
}));
|
}));
|
||||||
builder.CloseComponent();
|
builder.CloseComponent();
|
||||||
});
|
});
|
||||||
|
|
@ -219,7 +228,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
Assert.Equal(2, renderer.Batches.Count);
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
var secondBatch = renderer.Batches[1];
|
var secondBatch = renderer.Batches[1];
|
||||||
Assert.Equal(1, nestedComponent.NumRenders);
|
Assert.Equal(1, nestedComponent.NumRenders);
|
||||||
Assert.Equal(2, secondBatch.DiffsByComponentId.Count); // Root + CascadingValue, but not nested one
|
Assert.Equal(3, secondBatch.DiffsByComponentId.Count); // Root + CascadingValue + CascadingValue, but not nested component
|
||||||
|
|
||||||
// We *did* send updated params during the first render where it was removed,
|
// We *did* send updated params during the first render where it was removed,
|
||||||
// because the params are sent before the disposal logic runs. We could avoid
|
// because the params are sent before the disposal logic runs. We could avoid
|
||||||
|
|
@ -386,5 +395,10 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
builder.AddContent(0, $"CascadingParameter={CascadingParameter}; RegularParameter={RegularParameter}");
|
builder.AddContent(0, $"CascadingParameter={CascadingParameter}; RegularParameter={RegularParameter}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SecondCascadingParameterConsumerComponent<T1, T2> : CascadingParameterConsumerComponent<T1>
|
||||||
|
{
|
||||||
|
[CascadingParameter] T2 SecondCascadingParameter { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue