如何定义骨干路由的默认行为?

时间:2013-01-07 20:41:48

标签: jquery backbone.js

我正在使用backbone.js作为应用程序的前端。其中一个导航规则与身份验证流程非常相似:如果有可用的某些信息,应用程序应仅呈现用户请求的视图。否则,应呈现另一个视图。可以通过查询服务器来确定信息是否可用。到目前为止我尝试了什么:

  //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)。但这并不像预期的那样有效。实际作为参数传递的函数并不总是在第一段代码中声明的函数。

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

这可能不是最好的“干”方式,但它可以工作,除了已经包含的Underscore库之外不需要任何Backbone插件。这使用_.wrap函数,它将第一个函数包装在第二个函数中。

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();
      }
     }
   });
 }