• 基于Backbone.js的JavaScript MVC示例程序(8)


    3.5 删除User

    在 User 列表中每一个条目的左侧增加一个 "del" 按钮,点击之后就会删除当前的条目,界面如下图所示:

    5.html

    1 <!-- 增加一个"del"按钮 -->
    2 <script type="text/template" id="user-item-template">
    3      <button id="delete-submit">del</button>(<%= id %>)</span><a href="#"><%= username %></a>
    4 </script>

    mvc5.js

     1 $(document).ready(function() { 
     2      
     3      var User = Backbone.Model.extend({
     4      });
     5      
     6      var UserList = Backbone.Collection.extend({
     7          ... //不变 
     8      });
     9      
    10      var UserItemView = Backbone.View.extend({
    11          events : { 
    12                "click a" : "displayInfo",
    13                "click #delete-submit" : "clear", //新增
    14          },
    15          initialize : function() { 
    16              this.model.bind('change', this.render, this);  
    17              this.model.bind('destroy', this.remove, this); //新增
    18          },
    19          clear : function(){ //新增
    20              this.model.destroy();
    21          },
    22          ... //其余不变 
    23      });
    24      
    25      var UserInfoView = Backbone.View.extend({
    26         initialize : function() {
    27             this.model.bind('change', this.render, this); 
    28             this.model.bind('destroy', this.remove, this); //新增
    29         },
    30          ... //其余不变 
    31      });
    32      
    33      var UserListView = Backbone.View.extend({
    34          ... //不变 
    35      });
    36      
    37      var userListView = new UserListView();
    38      var infoView; 
    39  });

    这个功能只增加了6行 JavaScript 代码,还是比较简单的,需要说明的前几节都说过了,只能没话找点话说了……

    上面的代码里,删除执行的流程是仿照官网的例子 Todos 来写的,如下图所示:

    于是我想了一下,为什么非要通过绑定 User 的 destroy 事件来调用 UserItemView.remove() 呢?直接在 UserItemView.clear() 里面调用 remove() 不就完了?执行流程如下图所示:

    改完代码测试发现可行,而且代码的位置更加集中了,更容易理解和维护。

    但是仔细想一想,如果在 UserInfoView 也就是右侧用户详细信息的部分还有一个删除按钮,还是使用第一种方法好一些,因为 UserItemView.remove() 是绑定到了 User 的 destroy 事件上,而不管 User 被谁删除了,都会触发这个时间,从而执行 UserItemView.remove(),流程如下图所示:

    所以 UserInfoView 里面也需要将 remove() 方法绑定到 User 的 destroy 事件上(28行),否则如果如果右侧正在显示 User 的详细信息,左侧点击 "del" 之后只会删除左侧列表中的条目,而右侧详细信息仍然会显示。

    可以得出一个结论,尽量将跟 Model 相关的页面元素变化绑定到 Model 的事件上去,而不是在 View 中直接调用方法,这样的话无论 Model 在哪里被修改了,都会引起页面的变化。

     

  • 相关阅读:
    python类的__repr__方法
    元素定位之css选择器(1)
    selenium-find_element相关内容
    selenium-模块概述(1)
    元素定位之css选择器(2)
    css笔记
    html笔记
    html、css、javascript之间的关系
    去除提示“Chrome正在受到自动软件的控制”
    Python3+RobotFramework+pycharm环境搭建
  • 原文地址:https://www.cnblogs.com/hiddenfox/p/2648046.html
Copyright © 2020-2023  润新知