我将如何为这种情况实现js观察者或发布/订阅模式?

时间:2017-01-24 22:02:24

标签: javascript

我有以下问题场景。我的页面使用SystemJS加载js模块。在SystemJS加载了所有js模块之后,所有必需的js模块都可用于调用DataLoader.LoadData()。

我的页面加载外部svg。页面完全加载外部svg后,需要调用DataLoader.LoadData()来对svg元素执行操作:

<div id="divMapContainer"><object id="imgMap" data="map.svg" type="image/svg+xml" onload="DataLoader.LoadData();"></object>

所以这是我的问题:

如果我使用onload =“DataLoader.LoadData();”在上面的div中的方法然后不能保证SystemJS将完成它导入所需的js模块。在这种情况下,DataLoader.LoadData()将失败,因为并非所有必需的js模块都可用。

如果我在SystemJS完成导入所需的js模块后简单地调用DataLoader.LoadData(),则无法保证svg导入已完成。由于DataLoader.LoadData()对svg的特定元素执行操作,因此如果svg尚未完成加载,此函数将失败。

那么管理这种情况的解决方案是什么?它似乎可能是观察者或发布/订阅模式?应该使用jQuery.Callbacks吗?我为此审查了jquery文档但由于某种原因,具体的代码解决方案对我来说并不清楚。

=============================================== =========================

这是此问题的潜在解决方案的开始。

  • 当导入完成后,next then()可以设置LoadDataPreconditions.ImportsLoaded = true
  • 当svg加载时,它的onload()事件可以设置LoadDataPreconditions.SvgLoaded = true

    var LoadDataPreconditions = {    ImportsLoaded:true,    SvgLoaded:真实的 }

当LoadDataPreconditions对象发生更改时,某些类型的onchange侦听器可以连接到LoadDataPreconditions以执行以下函数:

function LoadDataConditional()
{
   var importsLoaded = LoadDataPreconditions.ImportsLoaded;
   var svgLoaded = LoadDataPreconditions.SvgLoaded;
   if(importsLoaded && svgLoaded) DataLoader.LoadData;
}

这看起来像是一种合理的方法吗?我该如何实现这个连线?

0 个答案:

没有答案