[英]Backbone View + Events
如果单击按钮或触发事件,为什么不触发事件? 我想念什么?
<html>
<head><script src="jquery-1.7.1.js" type="text/javascript"></script>
<script src="underscore.js" type="text/javascript"></script>
<script src="backbone.js" type="text/javascript"></script>
<script type="text/javascript">
var SearchView = Backbone.View.extend({
events: {
"click #testid": 'savenow'
},
initialize: function(){
console.log("init");
console.log($('testid'));
},
savenow: function(){
console.log("test save method");
}
});
// The initialize function is always called when instantiating a Backbone View.
// Consider it the constructor of the class.
var search_view = new SearchView({ el: $('#testid') });
search_view.trigger("savenow", "test");
</script></head>
<body>
<h1>test</h1>
<input id="testid" type="button" value="testbutton" />
</body></html>
上面的示例几乎被复制了,但在我的情况下却无法正常工作。
您遇到了一些问题。 正如其他答案所暗示的那样,需要更改events
对象。 默认情况下,这会将click事件绑定到#testid
,因为那是视图的el
。 一些阅读关于这个问题的delegateEvents 。
events: {
'click' : 'savenow'
}
您的第二个问题是-在加载DOM
之前先加载代码。 这意味着您的视图无法绑定到testid
元素。 要解决此问题,您需要将代码包装在document.ready()函数中。
<script type="text/template">
$(function() {
/* All your code
...
...
*/
});
第三个问题是当您调用search_view.trigger("savenow", "test");
savenow
事件已触发,但是没有人在监听该事件-因此似乎什么也没有发生。 您需要在视图上监听该事件:
initialize: function(){
console.log("init");
this.on('savenow',this.savenow,this);
// or this.listenTo(this,'savenow',this.savenow);
}
工作代码示例:
<html>
<head>
<script src="jquery-1.7.1.js" type="text/javascript"></script>
<script src="underscore.js" type="text/javascript"></script>
<script src="backbone.js" type="text/javascript"></script>
<script type="text/javascript">
// Run this block of code when the DOM is loaded.
$(function() {
var SearchView = Backbone.View.extend({
// Listen for click events on this view's element - '#testid'.
events: {
"click": 'savenow'
},
initialize: function(){
console.log("init");
// listen for the savenow event triggered by this view.
this.listenTo(this,'savenow',this.savenow);
},
savenow: function(){
console.log("test save method");
}
});
var search_view = new SearchView({ el: '#testid' });
search_view.trigger("savenow", "test");
});
</script>
</head>
<body>
<h1>test</h1>
<input id="testid" type="button" value="testbutton" />
</body>
</html>
您给el作为#testid-然后,您告诉它在配置事件时在#testid中查找#testid:
events:{
"click #testid":"savenow"
}
通过将事件对象更改为
events:{
"click":"savenow"
}
您只针对视图的所有el(在本例中为#testid)。
或者,您可以保持事件配置不变,将el更改为body或搜索面板的父div(我假设它包含文本输入字段或其他设置以及按钮)。
events: {
"click": 'savenow'
},
干得好! 没有选择器的事件类型将事件侦听器添加到视图el
本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.