Хобрук: Ваш путь к мастерству в программировании

Развертывание приложения Durandaljs/Phonegap на Android

Мне нужна помощь, я здесь на пределе. Я разработал приложение с durandaljs и тестировал его в браузере, пока что оно работает как сон! Затем я пытаюсь развернуть приложение на устройстве Android, и все рушится!

Я следовал указаниям здесь и здесь, чтобы оптимизировать мою сборку с Weyland с помощью Node. Я получаю файл main-build.js в папке моего приложения и папку сборки, в значительной степени содержащую все в папках приложения и lib (эй!!!). Итак, первый вопрос, что мне копировать в папку www моего Android-телефона; содержимое сборки или содержимое моего исходного приложения?

В руководстве говорится, что сборка включает пользовательскую версию 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; Я продолжал думать, как сделать так, чтобы приложение не запускалось до тех пор, пока не сработает устройство и не загрузится дом. Я видел это видео на YouTube и взял пример из кода ребят, так что теперь мой основной .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 logcat

Кто-нибудь знает, что я делаю неправильно, потому что многие люди, похоже, разрабатывают для Android, используя durandaljs. Заранее благодарим за любую помощь, которую вы можете оказать.


  • Пробовали ли вы копировать необработанные приложения, не предназначенные для сборки, как в режиме рабочего стола, в папку с ресурсами? Похоже, что некоторые ссылки отсутствуют. Куда вы звоните addRow? Этот объект определен? 28.10.2013
  • Привет, zewa, я не звоню аддроу, по крайней мере, я не знаю. Да, я пытался развернуть приложение с неоптимизированными файлами и requirejs и т. д., что просто дает мне ошибку сценария requirejs, выданную в каком-то файле, который я не создавал, и не очень описывает источник проблемы. 28.10.2013
  • Хорошо, если это не поможет, единственная разница должна быть с Кордовой. Вы пробовали другую версию? 28.10.2013
  • Ага, прошился на пару версий ниже до 2.8... проблема та же. Я думаю, что это должно быть что-то с моим кодом, потому что стартовый набор работает, хотя он действительно простой. Я попытаюсь «отделить» свое приложение и попытаться изолировать проблему. Спасибо 28.10.2013
  • Довольно сложно угадать баг без кодеков :) но вы на правильном пути. Разделяй и властвуй 28.10.2013

Ответы:


1

Я понял, в чем причина "замешательства". Если вы выполняли маршрутизацию с помощью Sammyjs до перехода на durandaljs, вы также можете столкнуться с этой путаницей. С sammyjs наличие маршрута в атрибуте href вашего представления действует как ссылка и автоматически направляет вас к соответствующему маршруту. Что-то вроде этого

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

или с привязкой ко

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

Это заставляет дюрандальцев сходить с ума! В 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 -->

or

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

Я надеюсь, что это избавит кого-то от ненужного горя, через которое мне пришлось пройти в течение нескольких часов, пытаясь понять, в чем проблема.

28.10.2013
  • Это поведение ограничено запуском оптимизированного приложения в Android или это происходит и с оптимизированной версией в браузере? 29.10.2013
  • Как раз в андроиде и вроде бывает, оптимизирован он или нет. Он отлично работает как в браузере, так и в эмуляторе Ripple. 29.10.2013
  • Вероятно, лучше всего создать задачу на github.com/BlueSpire/Durandal/issues?state=open и ссылку на эту тему. 29.10.2013
  • Хорошо, я сделаю, у меня есть еще один вопрос durandaljs /19681076/durandal-event-in-widgets, может быть, вы могли бы мне помочь ;) Спасибо. 30.10.2013
  • Новые материалы

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..