5

SammyJs でアプリを作成しました。現在、ブラウザで完全に動作します。ただし、PhoneGap を使用して Android にパッケージ化すると、ルートが機能しなくなります。

私はこのSOの質問を見つけました。ただし、指定された解決策は機能しません。

(function($) {

    var app = $.sammy('[role=main]', function() {
      this.disable_push_state = true;
      ...
    });
}

誰も同じ問題を経験したことがありますか?

編集

また、ルーティングを無効にするために、次のスクリプトで jquery mobile を使用しています。

 <script type="text/javascript">
      // DISABLE JQM ROUTER
      $(document).bind("mobileinit", function () {
        $.mobile.ajaxEnabled = false;
        $.mobile.linkBindingEnabled = false;
        $.mobile.hashListeningEnabled = false;
        $.mobile.pushStateEnabled = false;
        $.mobile.changePage.defaults.changeHash = false;
      });
    </script>

アプリのサミー javascript (ルートを含む)で要点を作成しました。

4

1 に答える 1

1

問題はこのaround句にあると思います:

this.around(function(callback) {
  var context = this;

  url = 'http://localhost:3000/api.json?school=' + localStorage.school

  this.load(url)
    .then(function(data) {
      parsed = JSON.parse(data);

      //if (parsed.meta != undefined) {
      //  alert(parsed.meta.message);
      //}
      context.products = parsed.products;
      context.places = parsed.places;
      context.school = parsed.school;
      context.title = $('[data-role=header] h1');
    })
    .then(callback); // *** this won't get called if load() rejects promise
});

私が理解しているように、around 句は callback() で呼び出され、呼び出されたときにルートのロードを続行します。

あなたのプロミスチェーンに問題があると思います。load() が拒否された promise を返した場合 (携帯電話に localhost:3000 がないため、おそらくそうなります)、 then() 関数はどちらも読み込まれません。そのため、callback() は呼び出されず、アプリは「停止」します。(a) そこにエラー処理を追加して、何が起こっているかを確認し、(b) load() の結果に関係なくコールバックを実行することをお勧めします。また、JSON.parse(data) は、データが適切な JSON でエンコードされた文字列でない場合にエラーをスローします。それについても、try/catch が必要です。

私はこれを試してみます:

this.load(url)
.then(function(data) {
  try {
     parsed = JSON.parse(data);
  } catch(e) {
     console.log('error decoding json!: '+errorMsg);
  }

  //if (parsed.meta != undefined) {
  //  alert(parsed.meta.message);
  //}
  context.products = parsed.products;
  context.places = parsed.places;
  context.school = parsed.school;
  context.title = $('[data-role=header] h1');
},function(errorMsg){
  console.log('error loading json!: '+errorMsg);
})
.fin(callback); // *** fin() is meant to execute on both success and error, like a "finally".

promises の実装が fin() をサポートしていない場合は、同等のものを呼び出しているか調べてください。これは基本的に次の省略形です。.then(callback).otherwise(callback)

簡単に言うと、 around に渡されたコールバックが何があっても実行されるようにするか、アプリがルートのロードを続行しないようにする必要があります。これは、予期しない動作のようです。

コンソールが表示されないという点については、あなたの環境がどのように見えるかはわかりませんが、過去に Eclipse と ADT で成功したことがあります。コンソールのログとエラーは問題なく表示されます。

于 2013-08-27T20:22:41.880 に答える