2

我将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如果默认行为不适用,它应该调用另一个函数(在上面的代码中命名)。但这并没有按预期工作。实际作为参数传递的函数并不总是在第一个代码片段中声明的函数。

还有另一种方法可以做到这一点吗?

4

1 回答 1

1

这可能不是最好的“干”方式,但它可以工作并且不需要任何 Backbone 插件,除了已经包含的 Underscore 库。这使用了_.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();
      }
     }
   });
 }
于 2013-01-07T21:50:34.437 回答