2013-08-25 8 views
8

私はアンドロイドのアプリケーションをrequire jsとBackboneを使って開発しています。コレクションから取ったモデルをtouchendイベント経由でルータに渡す必要があります。どうしたらいいですか?モデルをルータに渡す

define(["jquery", "underscore","backbone","handlebars", "views/CinemaView", "models/CineDati", "text!templates/listacinema.html"], 

function($,_,Backbone,Handlebars,CinemaView, CineDati, template){ 
    var ListaCinemaView = Backbone.View.extend({ 
    template: Handlebars.compile(template), 
    events: { 
     "touchend" : "Details" 
    }, 
    initialize : function(){ 
     var self = this; 
     $.ajax({ 
      url: 'http://www.cineworld.com/api/quickbook/cinemas', 
      type: 'GET', 
      data: {key: 'BwKR7b2D'}, 
      dataType: 'jsonp', // Setting this data type will add the callback parameter for you 
      success: function (response, status) { 
       // Check for errors from the server 
       if (response.errors) { 
        $.each(response.errors, function() { 
         alert('An error occurred. Please Try Again'); 
        }); 
       } else { 

        $.each(response.cinemas, function() { 
         var cinema = new CineDati(); 
         cinema.set({ id : this.id, name : this.name , cinema_url : this.cinema_url, address: this.address, postcode : this.postcode , telephone : this.telephone }); 
         self.model.add([cinema]); 

        }); 
        self.render(); 
       }} 
     }); 


    }, 

    events : { 
     "#touchend" : Dettagli 
    },  

    render : function(){ 
     $(this.el).empty(); 

     $(this.el).html(template).append(
      _.each(this.model.models, function (cinema) { 
       $("#lista").append(new CinemaView({ 
          model: cinema 
       }).render().el); }, this)); 

      return this; 
    }, 

    Dettagli : function(){ 

     Backbone.history.navigate(this.model , {trigger: "true"}); 
    } 


    }); 
    return ListaCinemaView; 

});  

答えて

5

Router.navigate()はデータを渡しません。これは、URLの断片を設定し、いくつかのオプションがあります。ここではドキュメントを参照してください:http://backbonejs.org/#Router-navigate

私の提案:

  • URLを変更するにはRouter.navigate()を使用してください。
  • Backbone.Eventsアグリゲーターを使用して、イベントとデータをトリガー(またはパブリッシュ)します。

映画のリストがあり、視聴ボタンがあるとします。ビューボタンは、表示したいモデルを公開し、URLフラグメントを変更します。

var vent = _.extend({}, Backbone.Events); // Create your app specific event aggregator 

var ListaCinemaView = Backbone.View.extend({ 

    ... 

    Dettagli : function(){ 
     vent.trigger('movie:show:request', this.model); 

     Backbone.history.navigate(this.model.get('id')); 
    } 
} 

movie:view:requestのハンドラをアプリ内に追加してください。

最後に、MarrionetteJSをチェックしてください。 publish/subscribeパターンを使用して、アプリケーションの各部分間の通信を処理します。基本的には、使用したい部分にオプトインするので、本当に素晴らしいフレームワークです。それは非常によく文書化され、サポートされています。また、その作成者、Derick Baileyは、Stackoverflowで非常にアクティブですので、迅速にヘルプを得るでしょう。

+0

ありがとうございますウィル、あなたはとても助けになりました!私はすでにmarionette.jsをチェックしており、私はそれを私の将来のアプリケーションに使うつもりだと思う! :) –

+0

嬉しい私は、アウグストを助けた。あなたのプロジェクトに幸運。 –

+2

この解決策は、誰かがhttp:// website/model_idにいったんページを更新した時点を考慮していません。あなたはモデルへの参照を失います。 –

7

あなたは、次のようバックボーンのナビゲート機能を無効にする必要があります:私はあなたが送信したいパラメータの取得/設定を行うためのカスタム機能「PARAM」が書かれている

ここ

var Router = Backbone.Router.extend({ 
 
    routeParams: {}, 
 
    routes: { 
 
     "home": "onHomeRoute" 
 
    }, 
 
    /* 
 
    *Override navigate function 
 
    *@param {String} route The route hash 
 
    *@param {PlainObject} options The Options for navigate functions. 
 
    *    You can send a extra property "params" to pass your parameter as following: 
 
    *    { 
 
    *    params: 'data' 
 
    *    } 
 
    **/ 
 
    navigate: function(route, options) { 
 
     var routeOption = { 
 
       trigger: true 
 
      }, 
 
      params = (options && options.params) ? options.params : null; 
 
     $.extend(routeOption, options); 
 
     delete routeOption.params; 
 

 
     //set the params for the route 
 
     this.param(route, params); 
 
     Backbone.Router.prototype.navigate(route, routeOption); 
 
    }, 
 

 
    /* 
 
    *Get or set parameters for a route fragment 
 
    *@param {String} fragment Exact route hash. for example: 
 
    *     If you have route for 'profile/:id', then to get set param 
 
    *     you need to send the fragment 'profile/1' or 'profile/2' 
 
    *@param {Any Type} params The parameter you to set for the route 
 
    *@return param value for that parameter. 
 
    **/ 
 
    param: function(fragment, params) { 
 
     var matchedRoute; 
 
     _.any(Backbone.history.handlers, function(handler) { 
 
      if (handler.route.test(fragment)) { 
 
       matchedRoute = handler.route; 
 
      } 
 
     }); 
 
     if (params !== undefined) { 
 
      this.routeParams[fragment] = params; 
 
     } 
 

 
     return this.routeParams[fragment]; 
 
    }, 
 

 
    /* 
 
    * Called when hash changes to home route 
 
    **/ 
 
    onHomeRoute: function() { 
 
     console.log("param =", this.param("home")); 
 
    } 
 

 
})

var router = new Router(); 
 
Backbone.history.start({}); 
 
router.navigate("home", { 
 
    params: 'Your data' 
 
});

をあなたは、このようなコードを書くことができ、コールバック関数の中に入るデータ内のデータを取得するには:あなたは、次のようにそれを送ることができるカスタムパラメータを送信するために今すぐ

this.param("home"); //this will return the parameter you set while calling navigate function or else will return null

関連する問題