2013-02-05 45 views
1

我有一个JQM应用程序,并且我正在合并Backbone。 由于我的初始JavaScript代码是巨大的,我只提取我认为是有问题的。 我下面的建议,并呼吁在这里引用步骤:从http://coenraets.org/blog/2012/03/using-backbone-js-with-jquery-mobile/

  • http://jquerymobile.com/test/docs/pages/backbone-require.html
  • 我有一个大问题,这是行为

    • JQM-config.js,问题就来了从这个代码:

      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”。但一旦发生,如果我点击一个refresh,这是间接地由同一路由器的规则重新处理,我结束了以下错误:

      Uncaught TypeError: Cannot call method 'trigger' of undefined

      我下载了jQuery Mobile的开发代码,并观察到这一点:

      // JQM1.1.2 - Line #3772 Show a specific page in the page container.

      $.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.fromPageundefinedsettings.pageContainerundefined。我想象一下,JQM无法对fromPage进行假设,因此无法继续刷新。我在$ mobile.changePage()上尝试过的所有选项都没有成功。我没有想法。

      UPDATE /网上用最小的现场重现该问题: apartindex,access the website with the bug

      任何帮助将不胜感激。

    +0

    这似乎是关于如何启动一个页面的骨干网页和jquery移动页面刷新... –

    +1

    不知道...是否有可能获得一个链接到现场项目? –

    +0

    我应该能够删除大量的东西,并把它放在网上,明天之前,请继续关注。 –

    回答

    1

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

    把它放到mobileinitpageinit应该工作。

    (可惜我不能修改代码,方便地测试它。)

    +0

    我以前没有成功就试过了。我会在一小时内重试。我希望把这个网站放在jsfiddle上,但我不知道如何管理它上面的多个文件。 –

    +0

    我一直在尝试很多事情,但又一次没有成功。从chrome检查器的网络选项卡上可以看出,依赖关系似乎没问题。我对mobileinit有约束力,提议。我停止了pageinit上的绑定,原因是$ .mobile。设置必须在第一个pageinit之前设置。唉,我再也没有头发了。新代码位于网站apartindex.com。 –

    +1

    @ Mathias-Dev'mobileinit'在页面设置之前被触发,因此如果它不起作用就会有意义。你有没有尝试把设置和'Backbone.history.start();'放入'pageinit'? –

    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.history调用然后处理我的主页。第二个pageinit不会干扰设置,因为我只执行一次。

    我真的很失望这个设置。我现在会留下这个问题,因为它确实有点工作。

    0

    我发现问题的来源是jquery-mobile 1.3.0版。当我回退到JSM 1.2.0或1.2.1时,“Uncaught TypeError:Can not call method”触发器的“未定义”问题就消失了。

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

    0

    我已经使用方法Append(),而不是HTML()

    $('body').append(view.render().$el); 
    
    0

    我能够从“数据角色”改变页面数据的属性来解决这个问题,以“数据修复这个问题 - 移动页的”为什么JQM 1.3.2

    fromPage.data("mobile-page")._trigger("beforehide", null, { nextPage: toPage }); 
    
    0

    的4042线都参考设置

    $.mobile.autoInitializePage = true; 
    

    的In y我们的jQuery手机配置文件,有些地方像:

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

    可能会有所帮助。

    相关问题