2

アプリケーションのフロントエンドに backbone.js を使用しています。ナビゲーション ルールの 1 つは、認証フローに非常に似ています。アプリケーションは、特定の情報が利用可能な場合にのみ、ユーザーが要求したビューをレンダリングする必要があります。それ以外の場合は、別のビューをレンダリングする必要があります。情報が利用可能かどうかは、サーバーに問い合わせることで判断できます。私がこれまでに試したこと:

  //Router table definition, etc...

  var initialize = function(){

    var appRouter = new AppRouter;

    appRouter.on('route:somePage', withInfo(function(){
      //render view for 'somePage'
    }));

  ...

機能は次のwithInfoとおりです。

function withInfo(f) {
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: '/path/to/info',
    success: function (data, status, request) {
      var info = $.parseJSON(request.responseText);
      if (info){
        f.call();
      } else {
        var defaultView = new DefaultView();
        defaultView.render();
      }
    }
  });
}

基本的に、私がやろうとしているのは、デフォルトの動作で高階関数を定義することです。fデフォルトの動作が適用されない場合は、他の関数 (上記のコードで名前が付けられている) を呼び出す必要があります。しかし、これは期待どおりには機能しません。パラメータとして実際に渡される関数は、コードの最初のスニペットで宣言されている関数とは限りません。

これを行う別の方法はありますか?

4

1 に答える 1

1

これは最善の「無味乾燥な」方法ではないかもしれませんが、既に含まれている Underscore ライブラリ以外のバックボーン プラグインを必要とせずに機能します。これは_.wrap、最初の関数を 2 番目の関数内にラップする関数を使用します。

appRouter.on('route:somePage', _.wrap(function(){
  #render view for some Page
}, withInfo));

withInfo関数の場合、変更される唯一の行は条件です。

 function withInfo(f) {
   $.ajax({
     type: 'GET',
     dataType: 'json',
     url: '/path/to/info',
     success: function (data, status, request) {
       var info = $.parseJSON(request.responseText);
       if (info){
         f();
       } else {
         var defaultView = new DefaultView();
         defaultView.render();
      }
     }
   });
 }
于 2013-01-07T21:50:34.437 に答える