2013-10-27 110 views
0

我需要幫助,我在我的智慧在這裏結束。 我開發了一個應用程序與durandaljs和我一直在瀏覽器上做我的測試,到目前爲止它的作品就像一個夢!然後我嘗試將應用程序部署到Android設備,所有地獄都打破了!部署Durandaljs/Phonegap應用程序到Android

我按照指示herehere來使用節點優化我的構建與Weyland。我的應用程序文件夾中有一個main-built.js文件,並且包含一個包含應用程序和lib文件夾中的所有內容的構建文件夾(eek !!!)。所以第一個問題,我該怎麼複製到我的phonegap android www文件夾;構建的內容或我最初的應用程序的內容?

該指南說構建包括一個自定義版本的杏仁,所以我不需要在我的應用程序中加載requirejs(耶!),我只需要將requirejs腳本標記更改爲指向主構建(哪一個./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 video,我把從人的代碼提示所以現在看起來優化我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 

    }); 
} 
}); 

所以回優化後,我複製生成的內容+我的css文件夾,其沒有包含在優化到www文件夾中,運行phonegap local build android;然後我將其部署到我的Android設備。應用程序的第一頁(註冊頁面)加載正常,在logcat中,我可以看到很多與瀏覽器控制檯中可以看到的相同的東西,包括我自己的一些console.log檢查點。然而,當我點擊一個鏈接到任何其他網頁,我看到的是一個白色的屏幕設備上,並在無休止的錯誤在logcat的 logcat

有沒有人有任何想法,我做錯了以下使用durandaljs的人似乎正在爲Android開發人員。預先感謝您提供的任何幫助。

+0

您是否嘗試將非構建應用​​程序意味着像桌面模式一樣的原始狀態複製到assets文件夾中?聽起來像一些引用缺失。你在哪裏調用addRow?該對象是否定義了? – zewa666

+0

你好zewa,我至少不會說我知道的addrow。是的,我試圖用非優化文件和requirejs等來部署應用程序,這只是給我一個在我沒有創建的文件中引發的requirejs腳本錯誤,並且不是描述問題的源頭 –

+0

那麼如果那不是幫助唯一的區別應該與科爾多瓦。你有沒有試過另一個版本? – zewa666

回答

1

我想出了造成「混亂」的原因。如果您在遷移到durandalj之前一直在使用Sammyjs進行路由,那麼您可能也會陷入混亂。使用sammyjs,在視圖的href屬性中有一條路線就像一個鏈接,並自動將您導航到相應的路線。事情是這樣的

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

或劫結合

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

這使得durandaljs發狂!在迪朗達爾創建一個函數在您查看這樣的

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"> 

我希望這樣可以節省別人不必要的悲傷我爲了找出問題所在,不得不經歷數個小時。

+0

這種行爲是否僅限於在Android中運行優化的應用程序,或者在瀏覽器中是否會發生優化版本? – RainerAtSpirit

+0

只是在android中,它似乎發生優化與否。它可以在瀏覽器和紋波模擬器中完美地工作 –

+0

可能最適合在https://github.com/BlueSpire/Durandal/issues?state=open創建問題並鏈接到此主題。 – RainerAtSpirit