Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js:Why is';第二次触发t事件(delegateEvents没有帮助)_Javascript_Events_Backbone.js - Fatal编程技术网

Javascript Backbone.js:Why is';第二次触发t事件(delegateEvents没有帮助)

Javascript Backbone.js:Why is';第二次触发t事件(delegateEvents没有帮助),javascript,events,backbone.js,Javascript,Events,Backbone.js,这似乎是一个热门话题,然而,在尝试了5个不同答案中的几个解决方案后,我仍然无法正确回答。我有一个简单的表单,将来自两个字段的输入附加到屏幕上。“添加”按钮只工作一次(显示输入的数据),并且不会在第二次单击时触发其事件(我选中了-不再执行事件的渲染)。大多数建议的修复都涉及在视图的render方法末尾添加this.delegateEvents(),对我的情况没有任何影响,可能是我做得不对。我认为我所做的只是比其他人必须解决的问题简单 我意识到整件事可以有更好的结构/不同的结构,我只是按照其中一个教

这似乎是一个热门话题,然而,在尝试了5个不同答案中的几个解决方案后,我仍然无法正确回答。我有一个简单的表单,将来自两个字段的输入附加到屏幕上。“添加”按钮只工作一次(显示输入的数据),并且不会在第二次单击时触发其事件(我选中了-不再执行事件的
渲染
)。大多数建议的修复都涉及在视图的
render
方法末尾添加
this.delegateEvents()
,对我的情况没有任何影响,可能是我做得不对。我认为我所做的只是比其他人必须解决的问题简单

我意识到整件事可以有更好的结构/不同的结构,我只是按照其中一个教程,并陷入了第二次点击的问题。我只想知道:1。我的代码中到底是什么导致了这个bug。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>

名单

请在下面输入姓名和城市:

//类构造函数 var Router=Backbone.Router.extend({ 路线:{ “家”, “添加”:“添加人” } }); var router=新路由器(); var InputsList=Backbone.View.extend({ el:“.div_输入”, render:function(){ var template=35;.template($('#inputs').html(),{}); 此.$el.append(模板); } }); var inputsList=新inputsList(); 路由器.on('route:home',function(){ inputsList.render(); }); var PeopleList=Backbone.View.extend({ el:“div_people”, render:function(){ var template_person=u.template($(“#person_info”).html(),{person_name:$(“#input_name”).val(),person_city:$(“#input_name”).val(); 此.$el.append(模板\个人); } }); var peopleList=new peopleList(); on('route:addPerson',function()){ peopleList.render(); }); Backbone.history.start();
如果路线
#/add
没有改变,那么没有任何东西会触发改变。 如果您希望在每次单击时都收到通知,则需要侦听单击事件

Backbone.View.extend({
    events : {
        "click .input_submit_submit" : "myCallbackOnClick"
    },
    myCallbackOnClick : function(ev) {
        // <a> i was clicked
        ev.preventDefault();
        this.someOptionToRenderDifferently = true;
        peopleList.render();
    }
});
Backbone.View.extend({
活动:{
“单击。输入\提交\提交”:“myCallbackOnClick”
},
myCallbackOnClick:函数(ev){
//我被点击了
ev.preventDefault();
this.someoptionRenderDifferentily=true;
peopleList.render();
}
});

可能是因为您在第一次单击后就已经在该路线上了?也许你应该把它变成一个onclick事件而不是路由?所以我的问题是混淆了“路由”和“执行代码的事件”。我会试试你的建议。这是否意味着我需要将提交按钮拆分为单独的视图?我不希望在用户单击文本输入时执行任何事件。嗯,路由更改也是事件。但他们只开火一次。如果路由已经是“#/add”,则没有任何更改…实际上,您不需要更改任何视图逻辑。在我看来,您只需要说
peopleList.render()
。检查我的最新答案。我希望它能解决你的问题!我的输入\提交\提交包含提交按钮和文本输入。当我点击文本输入时,我不想要任何事件,只想点击按钮。因此,我将这两个视图解耦为两个视图,剩下的就是您所建议的。谢谢我仍然没有15分来投票支持你的答案,对不起。。