1

我有一个 JQM 应用程序,并且正在合并 Backbone。由于我最初的 javascript 代码很大,我只提取我认为有问题的内容。我正在遵循此处引用的建议和呼叫步骤:

我有一个大问题,这就是行为,问题来自这段代码:

 var r = Backbone.Router.extend
 router: ...    
    "page": "pageDisplay"
 ...
 pageDisplay: function(){
    c = new AView();      // Backbone.View    ...fetch() data...   
    $(c.el).page();       // Call to JQM to add its extra stuff; seems done correctly
    $.mobile.changePage( "#" + c.id, {changeHash: false});       // line 50
 }

跟随 的链接时<a href="#page" >,我按预期来到正确处理的页面“#page”。但是一旦在那里,如果我单击 a refresh,它被相同的路由器规则间接重新处理,我最终会出现以下错误:

未捕获的类型错误:无法调用未定义的方法“触发器”

我下载了 jquery 移动开发代码并观察到:

// JQM1.1.2 - 第 #3772 行在页面容器中显示特定页面。

  $.mobile.changePage = function( toPage, options ) {

  if ( isPageTransitioning ) { 
     pageTransitionQueue.unshift(arguments );
     return;      
  }
  var settings = $.extend( {}, $.mobile.changePage.defaults, options);

  // Make sure we have a pageContainer to work with.      
  settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
  // Make sure we have a fromPage.        
  settings.fromPage = settings.fromPage || $.mobile.activePage;
                                              // Line #3788   
  var mpc = settings.pageContainer,      // Line #3789        
      pbcEvent = new $.Event("pagebeforechange" ),
      triggerData = { toPage: toPage, options: settings };
  // Let listeners know we're about to change the current page.
  mpc.trigger( pbcEvent, triggerData );      // Line #3794

Uncaught TypeError是由第 #3794 行引起的,因为mpcundefined. 所以,从 JQM,在 Chrome 检查器中,我也可以看到settings.fromPageisundefinedsettings.pageContaineris undefined。我有点想象,JQM 无法对 fromPage 做出假设,因此无法继续我的刷新。我在 $mobile.changePage() 上尝试过的所有选项都没有成功。我没主意了。

更新/重现问题最少的在线网站:partindex,访问有错误的网站

任何帮助将不胜感激。

4

6 回答 6

1

调用路由代码的dextoInit函数在调用中$(document).ready()并不能保证 jQuery 移动页面实际上已经设置成功。但是路由器代码调用$.mobile.changePage取决于 jQuery Mobile 被初始化。

放入mobileinitpageinit应该工作。

(不幸的是我无法修改代码并轻松测试。)

于 2013-02-06T08:28:44.333 回答
0

尽管暂时修复了它,但它确实有缺点。见下文。

$(document).bind("pageinit", function(){
   console.log('bindtomobileinit: event pageinit received');
   if ( !window.AppNode.router ){
      window.AppNode.router = new AppNode.singletons.router();
      console.log("mobileRouter.js: Starting b history");
      console.log('mobileRouter.js: About to launch Backbone history');
      Backbone.history.start();  
   }

});

注册到pageinit有被解雇两次的奇怪效果。我看到 2 个节点已添加到 Dom:默认的“加载” jquery mobile div(与 pageinit:1 相关)和我的data-role page(pageinit:2)。因此,在“刷新浏览器单击”时,我的情况让我等待第一次pageinit,创建一个意外的 jquery 移动 dom 元素(创建的默认页面以显示等待的 JQM 圆形动画),触发路由器创建,并允许 Backbone。历史调用,然后处理我的“”主页。第二个pageinit不会干扰设置,因为我只执行一次。

我对这个设置真的很失望。我现在将留下这个问题,因为它确实有效。

于 2013-02-06T19:14:10.263 回答
0

我发现问题的根源是 jquery-mobile 版本 1.3.0。当我回退到 JSM 1.2.0 或 1.2.1 时,“Uncaught TypeError: Cannot call method 'trigger' of undefined”问题就消失了。

顺便说一句,我没有使用 Backbone。

于 2013-03-25T15:56:04.020 回答
0

我已经通过使用方法 append() 解决了这个问题,但不是 html()

$('body').append(view.render().$el);
于 2013-10-10T13:43:19.343 回答
0

我能够通过将页面数据属性从“data-role”更改为“data-mobile-page”来解决这个问题,正如 jqm 1.3.2 第 4042 行中引用的那样

fromPage.data( "mobile-page" )._trigger( "beforehide", null, { nextPage: toPage } );
于 2013-10-24T03:02:34.803 回答
0

环境

$.mobile.autoInitializePage = true;

在您的 jquery 移动配置文件中,某些地方如:

$(document).on("mobileinit", function () {...});

可能会有所帮助。

于 2013-10-29T12:27:12.417 回答