2013-10-10 45 views
0

对于非常特殊的情况,我想存储从localStorage中远程加载的Dojo类(即源代码),以便在离线情况下访问它们(我们正在讨论混合移动应用程序)。我得到的一切运行,但dojo.eval不会让我这样从从字符串内容加载Dojo类而不是文件

var data = 'define(["dojo/_base/kernel",...'; // class definition as string 
dojo.eval(data); 

字符串创建类的任何想法如何做到这一点?

回答

0

如果您需要让应用脱机运行,请将资源(css,images,js)存储在app manifest中。清单文件如下所示。

{ 
    "name": "My App", 
    "description": "My elevator pitch goes here", 
    "launch_path": "/", 
    "icons": { 
    "128": "/img/icon-128.png" 
    }, 
    "developer": { 
    "name": "Your name or organization", 
    "url": "http://your-homepage-here.org" 
    }, 
    "default_locale": "en" 
} 

您的应用程序可能需要数百个模块,这样的性能和清单的管理,你要创建一对夫妇取决于你如何创建一个Dojo build将的js文件的数量减少到一个或可能构建。

+0

谢谢。是的,标准离线处理适用于标准情况(尽管我从来没有在混合应用程序中使用它)。但是我不提前知道JS文件。在运行期间,我会根​​据我远程加载的动态配置文件加载这些自定义创建的文件。我希望将它们存储起来,以便出于性能原因或脱机情况准备好它们。唯一缺少的链接是classloader define和declare,在eval中运行时似乎不起作用。 – klimbimberle

+1

为了澄清,'define()'定义了模块。它不声明Dojo类。你需要'declare()'。我不明白你为什么需要评估模块定义。为什么不在需要时调用'define(...)'或'require()'?你想通过评估这个字符串,而不仅仅是定义一个模块来完成什么?您是否试图通过在运行时加载模块来获得性能?如果是这样,则不需要评估。 'require()'应该做到这一点。如果您要确保运行时加载的模块来自本地存储,请将它们添加到清单中。 –

0

我终于完成了我想要完成的任务。但是,我发现没有办法使用localStorage并从字符串中加载类。 诀窍是使用XHR从远程加载Dojo类源文件,使用Cordova File API存储它,获取存储文件的URL并在require()中使用此URL。 做我想要的,并让我完全控制缓存的文件。

相关问题