0

我需要帮助,我在这里无能为力。我已经用 durandaljs 开发了一个应用程序,并且一直在浏览器上进行测试,到目前为止,它的运行就像做梦一样!然后我尝试将应用程序部署到安卓设备上,一切都崩溃了!

我按照此处此处的说明使用 Node.js 优化我的 Weyland 构建。我的 app 文件夹中有一个 main-built.js 文件,还有一个 build 文件夹,其中几乎包含 app 和 lib 文件夹中的所有内容(eek !!!)。所以第一个问题,我应该将什么复制到我的 phonegap android www 文件夹中;构建的内容还是我的初始应用程序的内容?

该指南说该构建包含一个自定义版本的 Almond,因此我不需要在我的应用程序中加载 requirejs(耶!),我只需将 requirejs 脚本标记更改为指向 main-built(哪个是 . /build/app/ 或 ./app 中的那个??)。

所以我在我的初始应用程序中使用了那个,现在我的 index.html 中只有两个脚本引用

<script type="text/javascript"  src="phonegap.js"></script>
<script src="./app/main-built.js"></script>

在我的 main.js 中进行一点回溯;我一直在思考如何确保应用程序在触发 deviceready 并且加载 dom 之后才启动。我看到了这个youtube 视频,我从伙计们的代码中得到了启发,所以现在我的 main.js 在优化之前看起来部分像这样

requirejs.config({
paths: {
    'text': '../lib/require/text',
    'async': '../lib/require/async',
    'domReady': '../lib/require/domReady',
    'durandal': '../lib/durandal/js',
    'plugins': '../lib/durandal/js/plugins',
    'transitions': '../lib/durandal/js/transitions',
    'knockout': '../lib/knockout/knockout-2.3.0',
    'bootstrap': '../lib/bootstrap/js/bootstrap',
    'jquery': '../lib/jquery/jquery-1.9.1',
    'jpanelmenu': '../lib/jpanelMenu/jquery.jpanelmenu.min'
},
shim: {
    'bootstrap': {
        deps: ['jquery'],
        exports: 'jQuery'
    }        
}
});


define(['domReady', 'durandal/system', 'durandal/app', 'durandal/viewLocator', 'scripts/dealtag'], function (domReady, system, app, viewLocator, dealtag) {

domReady(function () {
    var useragent = navigator.userAgent.toLowerCase();

    if (useragent.match(/android/) || useragent.match(/iphone/) || useragent.match(/ipad/) || useragent.match('ios')) {
        document.addEventListener('deviceready', onDeviceReady, false);
    }
    else {
        onDeviceReady('desktop');
    }
});

function onDeviceReady(desktop) {
    if (desktop !== 'desktop')
        cordova.exec(null, null, 'SplashScreen', 'hide', []);

    app.title = 'My App';
    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();
       ....my own initialization code

    });
}
});

所以回到优化后,我将build +我的css文件夹的内容复制到www文件夹中,然后运行phonegap local build android;然后我将它部署到我的 android 设备上。应用程序的第一页(注册页面)加载正常,在 logcat 中,我可以看到很多在浏览器控制台中可以看到的相同内容,包括我自己的一些 console.log 检查点。但是,当我单击链接转到任何其他页面时,我所看到的只是设备上的白屏以及 logcat 中永无止境的错误 日志猫

有谁知道我做错了什么,因为很多人似乎正在使用 durandaljs 为 android 开发。提前感谢您提供的任何帮助。

4

1 回答 1

1

我弄清楚了“混乱”的原因是什么。如果您在迁移到 durandaljs 之前一直在使用 Sammyjs 进行路由,那么您也可能会遇到这种困惑。使用 sammyjs,在视图的 href 属性中有一个路由就像一个链接,并自动将您导航到相应的路由。像这样的东西

<a href="#mypage">My Page</a>

或带有 ko 绑定

<a data-bind="attr: {href: '#mypage/' + id}"></a>

这让 durandaljs 发狂!在 durandal 中,在您的视图模型中创建一个函数,如下所示

define(['plugins/router', 'knockout'], function (router, ko) {
var myviewmodel= function () {
    this.list= ko.observableArray();
}
....
myviewmodel.prototype.showItem = function (item) {
    router.navigate('mypage/' + item.id);
}

return myviewmodel;
});

然后在你看来你可以拥有

<a data-bind="click: $parent.showDeals"> <!-- if within a list context -->

或者

<a data-bind="click: showDeals">

我希望这可以避免我不得不经历几个小时试图找出问题所在的不必要的悲伤。

于 2013-10-28T22:53:53.243 回答