javascript - Backbone.js:为什么事件没有第二次触发(delegateEvents 没有帮助)

标签 javascript events backbone.js

这似乎是一个流行的话题,但是,在尝试了 5 个不同答案中提出的几种解决方案后,我仍然无法得到正确的结果。我有一个简单的表单,将两个字段的输入附加到屏幕上。 “添加”按钮工作一次(显示输入的数据),并且在第二次单击时不会触发其事件(我检查过 - 事件的渲染不再执行)。大多数建议的修复涉及在 View 的 render 方法末尾添加 this.delegateEvents() - 在我的情况下没有任何效果,也许我没有这样做正确的。我认为我正在做的事情比其他人必须解决的问题更简单。

我意识到整个事情的结构可以更好/不同,我只是按照其中一个教程进行操作,然后陷入了第二次点击问题。我只想知道: 1. 我的代码中到底是什么导致了该错误。 2. 如何克服它,最好不要重写整个事情。

谢谢!

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Name List</title>
    <link rel="stylesheet" href="name_book.css"/>
</head>
<body>

<div class="container"></div>     
    <div class="div_people"></div>
    <hr>
    <div class="div_inputs"></div>
</div>


<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"></script>

<!--template for the inputs-->
<script type="text/template" id="inputs">
    Please enter name and city below:<br>
    <form id="add_person_form" class="add_person_form">
    <div id="div_input_name" class="input_name" style="float:left"><input id="input_name" type="text" /></div>
    <div class="div_input_city" style="float:left"><input id="input_city" type="text" /></div>
    <a href="#/add" class="input_submit_submit">Add</a>
    </form>
</script>

<!--template for the screen output row-->
<script type="text/template" id="person_info">
    <span class="person_name"><%= person_name %></span>
    <span class=spacer></span>
    <span class="person_city"><%= person_city %></span>
    <br>
</script>

<script>
    //class constructor
    var Router = Backbone.Router.extend({
        routes: {
            '': 'home',
            'add': 'addPerson'
        }
    });

    var router = new Router();

    var InputsList = Backbone.View.extend({
        el: '.div_inputs',
        render: function() {
            var template = _.template($('#inputs').html(), {});
            this.$el.append(template);
        }
    });

    var inputsList = new InputsList();
    router.on('route:home', function() {
        inputsList.render();
    });         

    var PeopleList = Backbone.View.extend({
        el: '.div_people',
        render: function() {        
            var template_person = _.template( $("#person_info").html(), {person_name: $("#input_name").val(), person_city: $("#input_name").val()} );
            this.$el.append(template_person);
        }
    });

    var peopleList = new PeopleList();

    router.on('route:addPerson', function() {
        peopleList.render();
    });     

    Backbone.history.start();
</script>
</body>
</html>

最佳答案

如果路由#/add没有改变,那么就没有什么会触发改变。 如果您希望每次点击时都收到通知,则需要监听点击事件。

Backbone.View.extend({
    events : {
        "click .input_submit_submit" : "myCallbackOnClick"
    },
    myCallbackOnClick : function(ev) {
        // <a> i was clicked
        ev.preventDefault();
        this.someOptionToRenderDifferently = true;
        peopleList.render();
    }
});

关于javascript - Backbone.js:为什么事件没有第二次触发(delegateEvents 没有帮助),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747966/

相关文章:

javascript - 为什么 Google 优化 javascript 不在页面刷新时执行?

javascript - ZeroClipboard 不适用于该网站的移动版本

javascript - 当我的动画完成时,transitionend 事件不会触发

spring - 成功部署 Spring 应用程序后运行代码

javascript - Backbone 尝试使用 put 而不是 post

javascript - 带有 Backbone.js 的 JS 模板系统

JavaScript - 忽略鼠标是否位于文本区域的 "resize handle"上

javascript - Vue.js 将存储数据作为 prop 传递会导致突变警告

java - 如何使用 Sawtooth Java SDK 创建 channel 事件?

javascript - 同时在 Backbone.js 中对 Collection 的 ListView 重新编号