javascript - backbone model 重复绑定问题

 临沂李晓楠 发布于 2022-11-25 04:36

这是 router 中的一个函数。

routes: {
  "post/:id": "postEdit"
},
postEdit: function (id) {

  console.log('router.js, got router: #/post/' + id);

  UILoading($("#main"));

  var model = new PostModel({_id: id});

  model.fetch({
    success: function () {
      new PostEditView({model: model});
    },
    error: function () {
      console.log("failed, on router: #/post/" + model.id);
    }
  });
}

接下来是 View 的代码

var PostEditView = Backbone.View.extend({

    el: '#main',
    template: doT.template(PostEditTemplate),

    events: {
      'click #savePost': 'save'
    },

    initialize: function () {
      _.bindAll(this, 'render');
      this.model.bind("change", this.render, this);

      var converter = Markdown.getSanitizingConverter();
      this.editor = new Markdown.Editor(converter);

      this.render();
    },

    render: function () {
      this.$el.html(this.template(this.model.toJSON()));
      this.editor.run();
    },

    save: function () {
      this.model.set({
        title: $("#post_title").val(),
        slug: $("#post_slug").val(),
        created: $("#post_created").val(),
        tags: $("#post_tags").val().split(','),
        content: $(".post_content").val()
      });

      this.model.save();
    }

  });

最后发现,当访问过多次#/post/5103fbb3817feb1c10000001,/#/post/5103c114ce4c724c12000002 后,save 这个函数会重复调用。

相当于之前的 model 没有被释放,事件重复执行了。

如何解决这个问题呢?

2 个回答
  • routes: {
      "post/:id": "postEdit"
    },
    postEdit: function (id) {
    
      console.log('router.js, got router: #/post/' + id);
    
      UILoading($("#main"));
    
      var model = new PostModel({_id: id});
      var view = new PostEditView({model: model});
    
      model.fetch({
        error: function () {
          console.log("failed, on router: #/post/" + model.id);
        }
      });
    }
    

    view 里的initialize可以不直接执行render,放到事件里吧

    2022-11-25 05:46 回答
  • 自问自答。

    view 的切换,主要由路由来触发,所以在 router 中加了一个函数来做 view 切换管理。

    switchView: function (view) {
      if (this.currentView) {
        this.currentView.remove();
      }
      this.currentView = view;
    },
    

    每次 route ,都调用 switchview 来进行切换。

    // #/post/512c4527f7d8797818000001
    postEdit: function (id) {
      console.log('router.js, got router: #/post/' + id);
    
      var that = this;
      var model = new PostModel({_id: id});
      var view = new PostEditView({model: model});
        this.switchView(view);
        //...... do something.
      }
    
    2022-11-25 05:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有