【问题标题】:Typescript global app state to app instanceTypescript 全局应用程序状态到应用程序实例
【发布时间】:2020-03-14 14:15:31
【问题描述】:

我是 typescript 的新手,我正在开发一个 WebGL 查看器,并面临应用程序全局变量的问题。

问题是这样的,WebGL 查看器将是 Vue 组件,因此可以在同一页面上插入多个组件。我想将画布上下文和其他一些数据存储为全局数据,这样我就可以通过导入它来访问我的所有“.ts”文件。由于我尝试在同一页面上使用两个组件,因此全局状态相互啮合。

这里是示例代码

class AppState {
    static CanvasID: string;
}


class viewer
{
   constructor(canvasID: string)
   {
     AppState.CanvasID = canvasID;
   }

   getCanvasID()
   {
      return AppState.CanvasID;
   }

}

class app
{
  public viewer: viewer;
  constructor(canvasID: string)
  {
    this.viewer = new viewer(canvasID)
  }
  getCanvasID()
  {
    return this.viewer.getCanvasID();
  }

}



function clientCode() {

   var app1 = new app("id1");

   alert(app1.getCanvasID());

   var app2 = new app("id2");    
   alert(app2.getCanvasID());

   alert(app1.getCanvasID());

}

clientCode();

在上面的代码中,您可以看到“AppState.CanvasID”的值在我创建新的应用实例(app2)时发生了变化。

我希望“AppState”对于每个实例都是本地的,并且我希望将“AppState”导入多个 .ts 文件并像全局一样使用。

我正在使用汇总构建为 esm 模块。

请就此提出您的建议。

【问题讨论】:

    标签: javascript typescript ecmascript-6 vuejs2 vue-component


    【解决方案1】:

    这是因为您将 AppState.CanvasId 设为静态。所以无论类的多少实例都指向同一个引用(你甚至没有创建新的 AppStates 所以在复古中应该更明显它是同一个引用。)。将其更改为不是静态的,您应该没问题。请注意,您需要在每个查看器中创建一个新的 AppState 实例,类似于您在应用程序类中创建查看器的方式。

    但是如果你真的想要它是静态的,你可以像这个例子一样使用 Map。注意我将“CanvasID”更改为“CanvasIDs”

    class AppState {
        static CanvasIDs: Map<viewer, string> = new Map<viewer,string>();
    }
    
    
    class viewer
    {
       constructor(canvasID: string)
       {
           AppState.CanvasIDs.set(this, canvasID);
       }
    
       getCanvasID()
       {
          return AppState.CanvasIDs.get(this);
       }
    
    }
    
    class app
    {
      public viewer: viewer;
      constructor(canvasID: string)
      {
        this.viewer = new viewer(canvasID)
      }
      getCanvasID()
      {
        return this.viewer.getCanvasID();
      }
    
    }
    
    
    
    function clientCode() {
      console.log("test")
       var app1 = new app("id1");
    
       alert(app1.getCanvasID());
    
       var app2 = new app("id2");    
       alert(app2.getCanvasID());
    
       alert(app1.getCanvasID());
    
    }
    
    clientCode();
    

    【讨论】:

    • 感谢您的回答。 AppState 不仅有 canvasID,还有一些其他变量,只需导入 Appstate.ts 文件即可在多个类中使用。仅出于这个原因,我将 canvasID 保持为静态。在您的情况下,如果我想访问其他类中的 canvasID,那么我需要查看器对象,但我想使用 canvasID 的类将无法访问查看器对象。
    • 我不完全确定我是否遵循。您将可以通过执行 AppState.CanvasIDs.keys() 访问所有画布 id,您不需要查看器来查看它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多