当输入键由jquery触发时,我的模型是未定义的
When on enter keypress is triggered by jquery my model is undefined
我使用require.js和backbone.js来构建我的应用程序。在我的一个观点中:
define(['backbone', 'models/message', 'text!templates/message-send.html'], function (Backbone, Message, messageSendTemplate) {
var MessageSendView = Backbone.View.extend({
el: $('#send-message'),
template: _.template(messageSendTemplate),
events: {
"click #send": "sendMessage",
"keypress #field": "sendMessageOnEnter",
},
initialize: function () {
_.bindAll(this,'render', 'sendMessage', 'sendMessageOnEnter');
this.render();
},
render: function () {
this.$el.html(this.template);
this.delegateEvents();
return this;
},
sendMessage: function () {
var Message = Message.extend({
noIoBind: true
});
var attrs = {
message: this.$('#field').val(),
username: this.$('#username').text()
};
var message = new Message(attrs);
message.save();
/*
socket.emit('message:create', {
message: this.$('#field').val(),
username: this.$('#username').text()
});
*/
this.$('#field').val("");
},
sendMessageOnEnter: function (e) {
if (e.keyCode == 13) {
this.sendMessage();
}
}
});
return MessageSendView;
});
当jquery触发按键事件并调用sendMessage函数时,由于某种原因,消息模型是未定义的,尽管当require.js首次加载此视图时,它是可用的。有什么提示吗?感谢
请参阅我的内联评论:
sendMessage: function () {
// first you declare a Message object, default to undefined
// then you refrence to a Message variable from the function scope, which will in turn reference to your Message variable defined in step 1
// then you call extend method of this referenced Message variable which is currently undefined, so you see the point
var Message = Message.extend({
noIoBind: true
});
// to correct, you can rename Message to other name, e.g.
var MessageNoIOBind = Message.extend ...
...
},
我的猜测是,您已经将sendMessageOnEnter
绑定为代码中其他地方的keypress
事件处理程序。通过这样做,您将在调用绑定事件处理程序的函数时更改this
的上下文。基本上,当你调用this.sendMessage()时,this
不再是你的MessageSendView对象,它很可能是你将keypress
事件绑定到的jQuery元素。由于你使用的是jQuery,你很可能通过使用$.prokey将sendMessageOnEnter
函数绑定到正确的上下文来解决这个问题。类似于:(注意-这根本没有测试)
var view = new MessageSendView();
$('input').keypress(function() {
$.proxy(view.sendMessageOnEnter, view);
});
我希望这有帮助,这里有更多的阅读给你。编码快乐!
JavaScript 中的绑定作用域
$.proxy
相关文章:
- Angular没有根据模型更新我的选择元素
- 在这种情况下,我应该如何在余烬中放置我的模型有很多关系
- 当输入键由jquery触发时,我的模型是未定义的
- 如果ng-if的计算结果为false,AngularJS会使我的模型数据无效
- MVC4剃刀在客户端javascript中访问我的模型中的JsonResult数据
- 无法在 javascript 中使用我的模型数据
- 为什么我的模型中的默认属性返回未定义
- 在 FTL 中向我的模型发送一个 JavaScript var
- Backbone fetch返回我的模型的所有实例
- 用Backbone.js设置我的模型
- 如果我的模型是MVC3中的QueryTable,如何访问Javascript中的项目数据
- 如何使用Parse cloud js保存我的模型
- 我的模型应该有多细粒度
- 当试图访问我的模型上的方法时,得到Javascript TypeError
- 我的dom不反映我的模型更新值,更新是由一个函数,这是按钮单击CAL完成的
- Backbone.js,require.js:我如何将我的模型、视图和集合转换为require.js模块
- 为什么我的模型值为空,如果我不包装脚本代码中的单击事件
- 我如何验证我的模型,当我有一个数组属性
- 为什么我不能从javascript访问我的模型对象
- ng-repeat不能用Object.create声明我的模型