fix(ivy): return new ViewRef when detaching view (#27437)
When detaching a view by its index via `ViewContainerRef.detach(index)`, in `ViewEngine` we used to return a new `ViewRef` ([for reference](https://github.com/angular/angular/blob/master/packages/core/src/view/refs.ts#L227)), however in Ivy we return the same `ViewRef` which means that its internal `_viewContainerRef` is never reset and we'll throw an error if the consumer tried to attach it to the `ApplicationRef`. These changes return a new `ViewRef` in order to match the original behavior. These changes also add the same errors as `ViewEngine` when attempting to attach a view that is attached already. This was the original goal of this PR, however it ended up uncovering the issues with the `ViewRef`. PR Close #27437
This commit is contained in:

committed by
Igor Minar

parent
7524c99be2
commit
862697d4bd
@ -258,11 +258,21 @@ export class ViewRef<T> implements viewEngine_EmbeddedViewRef<T>, viewEngine_Int
|
||||
*/
|
||||
checkNoChanges(): void { checkNoChanges(this.context); }
|
||||
|
||||
attachToViewContainerRef(vcRef: viewEngine_ViewContainerRef) { this._viewContainerRef = vcRef; }
|
||||
attachToViewContainerRef(vcRef: viewEngine_ViewContainerRef) {
|
||||
if (this._appRef) {
|
||||
throw new Error('This view is already attached directly to the ApplicationRef!');
|
||||
}
|
||||
this._viewContainerRef = vcRef;
|
||||
}
|
||||
|
||||
detachFromAppRef() { this._appRef = null; }
|
||||
|
||||
attachToAppRef(appRef: ApplicationRef) { this._appRef = appRef; }
|
||||
attachToAppRef(appRef: ApplicationRef) {
|
||||
if (this._viewContainerRef) {
|
||||
throw new Error('This view is already attached to a ViewContainer!');
|
||||
}
|
||||
this._appRef = appRef;
|
||||
}
|
||||
|
||||
private _lookUpContext(): T {
|
||||
return this._context = this._lView[PARENT] ![this._componentIndex] as T;
|
||||
|
Reference in New Issue
Block a user