javascript - 主干路由

标签 javascript backbone.js underscore.js url-routing

我正在创建一个应用程序,它将事件的日期列为按钮,然后让您添加日期并单击每个日期以获取新的“每日日历”。

这是我第一个使用主干和下划线的真实世界应用程序,所以我一直遇到障碍。我真的很感激任何帮助我的人。

我现在正处于我的收藏中充满日期的地步,我可以添加到这些日期。现在我想弄清楚的是它路由链接以根据所选日期切换日历。

到目前为止,这是我对这部分应用程序的了解:

收藏

var Days = Backbone.Collection.extend({
  url: daysURL
});

var Calendar = Backbone.Collection.extend({
    url: URL
});

模型

var Header = Backbone.Model.extend();
var header = new Header();

var ConferenceDay = Backbone.Model.extend();
var conferenceDay = new ConferenceDay();

查看

 var HeaderView = Backbone.View.extend({
  el: $(".conf_days"),
  template: _.template($('#days').html()),
  events: {
      'click a.day-link': 'changeDay',
      'click #add_day' : 'addDay',
      'click #previous_day' : 'prevDay',
      'click #next_day' : 'nextDay',
      'click #delete_day' : 'deleteDay'
    },
    initialize: function(){
      _.bindAll(this, "render");
      this.collection = new Days();
      this.collection.fetch();
      this.collection.bind("reset", this.render, this);
    },
    render: function(){
      var JSONdata = this.collection.toJSON();
      this.$el.html(this.template({days: JSONdata}));

      console.log(JSON.stringify(JSONdata))
      return this;

    },
    changeDay: function(e){

      AppRouter.history.navigate($(this).attr('href'));
      return false;

    },
    addDay: function() {
      newDate = Date.parse($('.day-link:first-child').text()).add(1).day();
      var newDay = new  ConferenceDay();
      newDay.set({date_formatted: newDate});

      this.collection.add(newDay)
      newDay.save({
        success: function(){
          alert('yes')
        },
        error: function(){
          alert('no')
        }
      });
    },
    deleteDay: function(event){
      var id = $('.day-link:last-child').data("id");
      $('.day-link:last-child').remove();
    },
    prevDay: function() {

    },
    nextDay: function() {

    },
    loadTimes: function(){
      var html = time.get('times');
      $('.time_td').append(html);
    }

  });
 var headerView = new HeaderView({ model: header });


        ConferenceView = Backbone.View.extend({
  el: $(".calendar"),
  template: _.template($('#calendar').html()),
  events: {

    },
    initialize: function(){

      //this.listTracks();
      this.collection = new Calendar();
      this.collection.fetch();
      this.collection.bind("reset", this.render, this);
    },
    render: function(){
      var JSONdata = this.collection.toJSON();
      this.$el.html(this.template({days: JSONdata}));
    },

    listTracks: function() {
    }

  });
 var conferenceView = new ConferenceView({model:conferenceDay});

我目前的路线

 var AppRouter = Backbone.Router.extend({
  routes: {
  '' : 'index',
  'day/:id' : 'changeDay'
  },

  initialize: function() {
  },

  index: function() {

  },
  changeDay: function(id){
    alert("changed");
    this.calender.changeDay(id);
    this.dayView = new ConferenceView({model:conferenceDay});
    $('#calender').html(this.dayView.render().el).text('test');
  },
});
 var app = {
 init: function() {
  var routes = new AppRouter();
  Backbone.history.start({pushState: true});
  }
}
 app.init();

理想情况下,我希望用户单击 day-link 按钮并通过推送状态将 url 更新到 day/:id 然后是 #calender 模板将使用当天更新收到的正确模型信息进行更新。

最佳答案

您的帖子中有很多代码,所以我不能 100% 确定下面的代码会涵盖您需要做的所有事情,但这只是一个开始

此事件处理程序可能会导致一些问题:

changeDay: function(e){
  AppRouter.history.navigate($(this).attr('href'));
  return false;
}

在细节层面上,这里有几件事:

  1. 您不需要引用历史。我不确定路由器是否具有这样的属性。您应该改为调用 AppRouter.navigate
  2. 如果你想让路由器触发你的changeDay路由方法,你需要传递一个选项trigger:true,像这样:

    AppRouter.navigate($(this).attr('href'), {trigger:true}).
    

然而,实际的解决方案还是比这更简单。您可以从事件哈希中完全删除 HeaderView.changeDay 事件处理程序和 click a.day-link 事件绑定(bind)。 Backbone Router 会检测到变化的 URL,并自动调用匹配新 URL 的路由方法。

关于javascript - 主干路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034325/

相关文章:

javascript - 使用 jQuery/javascript 从 CRM 2011 获取记录

javascript - Jquery 脚本在没有警报的情况下无法运行

javascript - 主干共享集合

javascript - 使用 js 和 underscore.js 显示代码时出现问题

javascript - 返回无效 0;与返回;

javascript - 带有 froala 的外部 CSS

javascript - 获取 NaN 而不是 Number

javascript - Backbone.js 我如何根据特定的应用程序状态定义一组自定义路由

javascript - jQuery Mobile 拆分按钮 clickEvent 无 ID

javascript - 下划线 -> var _ 函数