Backbone.js and jQueryMobile routing without hack or other router

后端 未结 3 978
独厮守ぢ
独厮守ぢ 2020-12-15 14:05

I am using backbone.js (0.5.3) with JQueryMobile (1.0 beta 2). I know there are routing conflicts when using those libraries together, and I would like to know if there is a

相关标签:
3条回答
  • 2020-12-15 14:26

    With jquery 1.2.0, disable ajax and linkBinding

    $(document).bind("mobileinit", function(){
        $.mobile.ajaxEnabled = false;
        $.mobile.hashListeningEnabled = false;
        $.mobile.linkBindingEnabled = false;
        $.mobile.pushStateEnabled = false;
      });
    

    after, which with normal Backbone routes, you can link a #id with

    <a href="#id" onclick="window.app_router.navigate('new', true)">Report</a>
    
    0 讨论(0)
  • 2020-12-15 14:29

    This may be a bit of a longshot as I have no way to test it, but try extending Backbone's history, and have it listen for a creation event before actually firing off the code. So..

    MyHistory = Backbone.History.extend({
        loadUrl : function(fragmentOverride) {
          var fragment = this.fragment = this.getFragment(fragmentOverride);
          var matched = _.any(this.handlers, function(handler) {
            if (handler.route.test(fragment)) {
              //This is the only change from core code.. 
              //We're just wrapping it into a callback.
              $('.ui-page-active').one('pagecreate', function () {
                  handler.callback(fragment);
              });
              return true;
            }
          });
          return matched;
        }
    });
    MyHistory.start();
    

    That might do it, or at least get you on the right path I hope.

    0 讨论(0)
  • 2020-12-15 14:39

    Ok the solution is to disable jQuery Mobile ajax loading feature and call the $.mobile.changePage method manually.

    HTML page :

        <script type="text/javascript" charset="utf-8" src="js/mobile/jquery.js"></script>
        <script type="text/javascript">
          $(document).bind("mobileinit", function(){
            $.mobile.ajaxEnabled = false;
            $.mobile.hashListeningEnabled = false;
          });
        </script>
        <script type="text/javascript" charset="utf-8" src="js/mobile/jquery-mobile.js"></script>
    

    Then whenever a new route is triggered, I first build my new "jQuery page canvas" in the Backbone View constructor, append it to the HTML document body and set my el view element to this new div :

    Backbone.View

        $("body").prepend("""
          <div id="my-id" data-role="page" class="cloudy-background-mobile">
            <div class="cloudy-header" data-role="header" data-position="fixed"></div>
            <div class="cloudy-content" data-role="content"></div>
          </div>
        """)
        this.el = $("#logs-view")
    

    And in the render method :

    // Build the content using undescore.js templating system
    this.el.find('.cloudy-content').html(this.template({logs : this.collection}));
    this.find('.cloudy-header').html(this.template_header({logbook: this.logbook}));
    
    // Change the page using jquery mobile and reapply jquery styles
    $.mobile.changePage(this.el, "slide", false, false);
    this.trigger( "pagecreate" );
    

    Works like a charm and without any unnecessary hacks :)


    Here is my full Backbone View if it can help anyone :

    class LogsView extends Backbone.View
      constructor: (options) ->
        super
        $("body").prepend("""
          <div id="logs-view" data-role="page" class="cloudy-background-mobile">
            <div class="cloudy-header" data-role="header" data-position="fixed"></div>
            <div class="cloudy-content" data-role="content"></div>
          </div>
        """)
        @el = $("#logs-view")
        @logbook = options.logbook
        @collection.bind 'reset', @render
    
        @template = _.template('''
          <ul data-role="listview" data-theme="c" data-inset="true">
            <% logs.each(function(log){ %>
              <li>
                <a href="#logs-<%= log.cid %>"><%= log.getLabel() %></a>
              </li>
            <% }); %>
          </ul>
        ''')
    
        @template_header = _.template('''
          <h1>Carnets <%= logbook.get('name') %></h1>
          <a href="#logbook-<%= logbook.cid %>-logs-new" data-icon="plus" class="ui-btn-right">&nbsp;</a>
        ''')
    
      render: =>
        # Build the content using undescore.js templating system
        @el.find('.cloudy-content').html(@template({logs : @collection}))
        @el.find('.cloudy-header').html(@template_header({logbook: @logbook}))
    
        # Change the page using jquery mobile and reapply jquery styles
        $.mobile.changePage(@el, "slide", false, false)
        @el.trigger( "pagecreate" )
    
    0 讨论(0)
提交回复
热议问题