2013-02-05 62 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() {...}); 
    

    可能會有所幫助。

    相關問題