【问题标题】:Sammyjs routes not working with PhonegapSammyjs 路由不适用于 Phonegap
【发布时间】:2013-08-18 14:52:40
【问题描述】:

我已经用 SammyJs 构建了一个应用程序。它目前在浏览器中完美运行。但是,当我使用 PhoneGap 将其打包到 Android 时,路由不再起作用。

我找到了this SO question。但是,给出的解决方案不起作用:

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

我使用我的应用 sammy javascript(包括路由)创建了一个 gist

【问题讨论】:

  • 能否提供定义路线的代码?
  • 我用要点更新了我的答案。
  • 在上传到手机之前,您正在将 URL 从 localhost 更改为正确的主机名/IP,对吗? url = 'http://localhost:3000/api.json?school=' + localStorage.school
  • 请用 phonegap 更新标签,以吸引 phonegap 专家
  • 我不知道 SammyJs,但正如我在文档中看到的“Sammy 是 samll web 框架”,所以你需要调用链接和类似的东西。要调用链接,您应该首先将其添加到白名单中,而且 Cordova 确实作为本地服务器作为概念工作,但它不是本地服务器,因此当您请求文件时,您应该直接使用它的名称而不使用“@987654323 @"

标签: javascript cordova sammy.js


【解决方案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
});

据我了解,round 子句是用回调()调用的,它会在调用时继续加载路由。

我认为你的承诺链有问题。如果 load() 返回一个被拒绝的 Promise(可能是这样,因为您的手机上没有 localhost:3000),那么您的 then() 函数都不会加载。因此,不会调用 callback() 并且应用程序“停止”。我会建议(a)在那里添加一些错误处理,这样你就可以看到它发生了什么,并且绝对(b)无论 load() 的结果如何都执行回调。此外 - 如果数据不是正确的 JSON 编码字符串,JSON.parse(data) 将引发错误 - 你也需要尝试/捕获。

我会试试这个:

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

如果你的 Promise 实现不支持 fin(),请查看它的等价物。它本质上是以下的简写:.then(callback).otherwise(callback)

长话短说 - 您要确保传递给 around 的回调无论如何都会被执行,否则您的应用将不会继续加载路由,这就是您的意外行为。

至于看不到控制台的问题,我不确定你的环境是什么样的,但我过去在 Eclipse 和 ADT 上取得了成功——我可以看到控制台日志和错误。

【讨论】:

  • 我的问题解决了。但是,我发现 JQM 使用 PhoneGap 非常慢,我不喜欢我必须与框架作斗争。我可能会改变我的观点并保留 Sammy...
  • 这可能不适用于您的情况,但我经常发现它的“明显”响应性与悬停/点击超时有很大关系。如果对点击响应缓慢,请检查jqm docs on cordova(如果您还没有的话)。尝试调整您的 $.mobile.buttonMarkup.hoverDelay 函数。它故意等待几百毫秒来区分悬停/点击 - 如果您没有可悬停的元素,您可以将其调低并让您的应用感觉更灵敏。
  • 比我之前的尝试更好的答案:stackoverflow.com/questions/11024464/…(确保您匹配您的 jqm 版本)
  • 我确实注意到了不同之处,尤其是点击延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2018-12-31
  • 2016-12-07
  • 2016-10-17
相关资源
最近更新 更多