我有一个使用requirejs加载其模块的Web应用程序。 Web应用程序在任何桌面浏览器中都可以正常运行,在与Cordova打包时也可以在iOS和Android上运行。但是,在构建Windows Phone 8 Cordova应用程序时不起作用。
我收到以下错误:
“未找到视图:通过路径”text!views / shell.html“搜索”views / shell“
(我正在使用Durandal)
我有以下应用程序结构:
www / app / main.js 包含以下代码:
requirejs.config({
//baseUrl: 'x-wmapp0:www/app',
baseUrl: 'app',
enforceDefine: true,
paths: {
'text': '../lib/require/text',
'durandal':'../lib/durandal/js',
'plugins' : '../lib/durandal/js/plugins',
'transitions' : '../lib/durandal/js/transitions',
'knockout': '../lib/knockout/knockout-2.3.0',
'bootstrap': '../lib/bootstrap3/js/bootstrap',
'jquery': '../lib/jquery/jquery-1.9.1',
'modules' : 'modules'
},
shim: {
'bootstrap': {
deps: ['jquery'],
exports: 'jQuery'
}
}
});
define(['durandal/system', 'durandal/app', 'durandal/viewLocator', 'bootstrap'], function (system, app, viewLocator, bootstrap) {
//>>excludeStart("build", true);
system.debug(true);
//>>excludeEnd("build");
app.title = 'MyApp';
app.configurePlugins({
router: true,
dialog: true,
widget: true
});
app.start().then(function() {
//Replace 'viewmodels' in the moduleId with 'views' to locate the view.
//Look for partial views in a 'views' folder in the root.
viewLocator.useConvention('viewmodels', 'views', 'views');
//Show the app by setting the root view model for our application with a transition.
app.setRoot('viewmodels/shell', 'entrance', 'applicationHost');
});
});
此代码适用于除WP8之外的所有设备。我尝试使用 baseUrl:'x-wmapp0:www / app'这一行来设置WP8 Cordova内部使用的实际路径,但这不起作用。那是因为它不是以'/'或http?
开头的路径有关如何配置requirejs以使用requirejs加载模块和视图的任何想法?
答案 0 :(得分:6)
看看这对你有什么帮助http://mikaelkoskinen.net/durandal-phonegap-windows-phone-8-tutorial/
此外,截至2013年10月18日,Phonegap Build已为WP8添加了测试版支持。添加“winphone:作为差距:平台,确保你使用的是phonegap 3.0。我们目前没有运气,但也许你可以使用它。
答案 1 :(得分:0)
我也为自己解决了这个问题,我最后做的是在加载deviceloaded
之前等待main.js
事件。
在deviceloaded
被触发时已应用的Cordova applies a patch to XMLHttpRequest。
在我的应用程序中,我最终看起来与此相似:
<script src="js/require.js"></script>
<script>
document.addEventListener('deviceloaded', function() {
var script = document.createElement('script');
script.src = 'js/main.js';
document.body.appendChild(script);
}, false);
</script>
我希望这也适合你!
另一件事,我在我的应用程序中注意到,如果我尝试加载weinre,我无法使用require.js启动我的应用程序。但我还没有进一步研究过这个问题。
答案 2 :(得分:0)
我建议将断点设置为cordovalib / XHRHelper.cs HandleCommand方法,看看发生了什么。此外,以下版本的HandleCommand可以更好地为您服务
public bool HandleCommand(string commandStr)
{
if (commandStr.IndexOf("XHRLOCAL") == 0)
{
string url = commandStr.Replace("XHRLOCAL/", "");
Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);
try
{
using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
{
if (isoFile.FileExists(uri.AbsolutePath))
{
using (
TextReader reader =
new StreamReader(isoFile.OpenFile(uri.AbsolutePath, FileMode.Open, FileAccess.Read))
)
{
string text = reader.ReadToEnd();
Browser.InvokeScript("__onXHRLocalCallback", new string[] { "200", text });
return true;
}
}
}
url = uri.AbsolutePath;
}
catch { }
var resource = Application.GetResourceStream(new Uri(url, UriKind.Relative)) ??
// for relative paths and app resources we need to add www folder manually
// there are many related issues on stackoverflow + some prev worked sample don't because of this
Application.GetResourceStream(new Uri("www/" + url, UriKind.Relative));
if (resource == null)
{
// 404 ?
Browser.InvokeScript("__onXHRLocalCallback", new string[] { "404" });
return true;
}
else
{
using (StreamReader streamReader = new StreamReader(resource.Stream))
{
string text = streamReader.ReadToEnd();
Browser.InvokeScript("__onXHRLocalCallback", new string[] { "200", text });
return true;
}
}
}
return false;
}