angularbrowser-tab

Angular open component in new tab without bootstrapping whole app


In my Angular 10 app I would like to open component in new browser tab. I would like to do that without bootstrapping whole app and creating another app instance.

I found article Open Angular components dynamically in new browser tab without bootstrapping the whole app again which describes exactly what I need.

But there are some issues - it's not working correctly. In Chrome incognito mode it works fine but in Chrome in normal mode or Firefox doesn't work. It opens new tab for few miliseconds and closes itself. On other computer it works fine in Firefox but doesn't work at all in Chrome.

My question is it possible to achieve that with some soluction or hack and allow it to work in any or most browsers? I wouldn't like to create multiple instances because it will be difficult to communicate and keep one state of app.


Solution

  • Practical Solution / Detection

    The problem is pop-up blocking, which is a general javascript problem and not only angular related. A solution is to detect when pop-ups are blocked/closed and to inform the user.

    I did a very rough implementation. I modified the popout.services.ts file and added a detection to see if the window is open and/or exists.

    I added the detectPopBlocker method that is executed 2 seconds after the intial window.open is called. Please note that the original code waiting 1 second in order to send the data to the new window instance.

    Project: https://stackblitz.com/edit/portal-simple-yyyffj?file=src/app/services/popout.service.ts

    openPopoutModal(data) {
        const windowInstance = this.openOnce(
          "assets/modal/popout.html",
          "MODAL_POPOUT"
        );
    
        // Wait for window instance to be created
        setTimeout(() => {
          this.createCDKPortal(data, windowInstance);
        }, 1000);
    
        setTimeout(() => {
          this.detectPopupBlocker(windowInstance);
        }, 2000);
      }
    
       detectPopupBlocker(windowInstance) {
        if (
          !windowInstance ||
          windowInstance.closed ||
          typeof windowInstance.closed == "undefined"
        ) {
          alert(
            "This site relies on a new browser windows to diplsay data. It seems the windows has been closed." +
              "Please disable any pop-up blockers or other such software for  the specific site. "
          );
        }
      }
    

    Theory

    The problem is not your code but instead it is related to ad/popup blocking.

    I tried the example in a browser without ad-blocking and it worked fine. I also tried it in a chrome browser with an Adblock extension and saw the behavior you mention (the popup window opened and closed immediately).

    It notified me that one advert was blocked.

    enter image description here

    So, as I did above, I implemented one of the simple pop-up blocker detectors (maybe even simple javascript based) in order to display a message when this happens.

    There are a variety of resources that show how to do this, for example: