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