【问题标题】:How to import webflow into Angular > 9如何将 webflow 导入 Angular > 9
【发布时间】:2021-03-03 23:41:09
【问题描述】:

我尝试将 webflow 生成的单个页面导入到我的 Angular 应用程序中,一旦在子页面中访问,它将被延迟加载。

我创建了一个子页面,在example-webflow.component.html中导入了webflow的html部分,并将css直接绑定到example-webflow.component.scss中。 我尝试在 angular.json 中导入 js,但似乎没有用。

有人已经进行了这样的导入吗?

我看到它正在使用这个库 freeformjs 使用 angular

【问题讨论】:

    标签: angular webflow


    【解决方案1】:

    我没有测试这个解决方案
    这是对@RamiAssi 的回答,因为他的解决方案正朝着正确的方向发展,但不会在每种情况下都可用,而且问题是关于延迟加载和加载我的主应用程序时不加载

    如果您想加载脚本而不是像接受的答案那样做,我建议您按照以下方式进行。

    在你想要的ngOnInit()中加载这个,isScriptLoaded 将确保你不会多次加载同一个脚本

    然后,在加载 webflow html 之前等待脚本被加载

    export class AnyComponent implements OnInit {
     loading = true
    
     ngOnInit(): void {
       if(this.loadScript('assets/theme/js/jquery-3.5.1.min.js') && this.loadScript('assets/theme/js/workflow.js')) 
        this.loading = false
      }
    
    <ng-container *ngIf="!loading"> 
      <!-- My webflow stuff -->
    </ng-container>
    
    /**
     *
     * @param target url to be loaded
     * @returns true when loaded
     */
    export const loadScript = (target: string): boolean => {
      if (!isScriptLoaded(target)) {
        const tag = document.createElement('script')
        tag.src = target
        document.body.appendChild(tag)
        return true
      }
    
      return true
    }
    
    export const isScriptLoaded = (target: string): boolean => {
      return document.querySelector('script[src="' + target + '"]') ? true : false
    }
    

    优化点

    你可以创建一个加载多个脚本的方法

    【讨论】:

      【解决方案2】:

      我仍然没有找到任何方法,所以我决定:

      1. webflow 导出导入我的角度assets 文件夹
      2. 使用 iframe 加载带有src='/assets/webflow/index.html' 的 webflow 组件

      【讨论】:

        【解决方案3】:

        我可以通过将 webflow 和 jquery js 文件动态添加到文档头来设法使 webflow 在 Angular 项目中工作。应用组件视图初始化后。

        import { Component, AfterViewInit } from '@angular/core';
        
        const dynamicScripts = [
          'assets/theme/js/jquery-3.5.1.min.js',
          'assets/theme/js/webflow.js',
          ];
        
        @Component({
          templateUrl: './app.component.html'
        })
        export class AppComponent implements AfterViewInit {
        
          constructor() {
            
          }
        
          ngAfterViewInit(): void {
            this.loadScript();
          }
        
          public loadScript() {
            for (let i = 0; i < dynamicScripts.length; i++) {
              const node = document.createElement('script');
              node.src = dynamicScripts[i];
              node.type = 'text/javascript';
              node.async = false;
              node.charset = 'utf-8';
              document.getElementsByTagName('head')[0].appendChild(node);
            }
          }
        }
        
        

        【讨论】:

        • 感谢您的回答。但我看到你的做法有一些负面影响。 1.你是直接在app.component中加载这个,为什么不直接在angular.json文件中呢? 2.这会破坏延迟加载体验,这会使第一次初始加载变慢。 3. 你如何确定这些脚本会在你的工作流 html 文件之前加载?
        • 你是对的。我已经编辑了答案以在 ngAfterViewInit 中加载 webflow 脚本。我猜这会对性能产生影响。老实说,这是我能达到的将 webflow 与 Angular 集成的最佳解决方案。
        • 我添加了一个新的回复,这对您有帮助吗? (因为你并没有真正回答这个问题,但可能是在正确的方向
        猜你喜欢
        • 2021-01-24
        • 2021-12-18
        • 2020-09-29
        • 1970-01-01
        • 2020-10-21
        • 2021-08-10
        • 2019-04-03
        • 1970-01-01
        • 2017-02-08
        相关资源
        最近更新 更多