我有一个体面的应用程序,有几个区域有很多javascript,其中一些形式很长,部分使用ajax。
我正在使用对象来尝试包含这些函数,但我只是想知道;
在某些情况下,我无法使用this.
,但必须使用对象名称。这与clearButton
设置中的情况类似。如果我传递此对象上的任何函数以用作回调(例如ajax成功),我也会遇到问题,因此它意味着ajaxSuccessCallBack
函数中的任何内容我使用OptionsForm
并且可以&#39 ; t使用this
感觉就像我在这里重新发明轮子,使用角度更适合这个(或其他东西),还是可以改善我当前的物体?我经常在页面中构建html,但为此我使用存储在<script type=text/html
区域的HTML。
以下是我正在使用的一些代码。 jsFiddle http://jsfiddle.net/vKXzL/1/
HTML
<form class="options" action="" method="post">
<input name="name" value="" />
<input name="email" type="email" value="" />
<select name="options"></select>
<button name="clear_name">Reset</button>
<button name="submit" type="submit">Submit</button>
</form>
的Javascript
var OptionsForm = {
init: function() {
this.declarations();
this.bindings();
},
declarations: function() {
this.form = $('form.options');
this.nameField = this.form.find('input[name=name]');
this.emailField = this.form.find('input[name=email]');
this.optionsField = this.form.find('select[name=options]');
this.clearButton = this.form.find('button[name=clear_name]');
this.submitButton = this.form.find('button[name=submit]');
},
bindings: function() {
this.clearButton.on('click', function(e) {
e.preventDefault();
OptionsForm.clearName();
});
},
clearName: function(e) {
this.nameField.val('');
},
ajaxSuccessCallBack: function(response) {
// anything here I have to use OptionsForm
},
populateOptions: function(options) {
// clear the field
// loop the options and add to list
}
};
OptionsForm.init();
答案 0 :(得分:2)
这实际上是Javascript奇怪部分的典型例子。 clearButton
函数中发生的情况是this
被本地分配给回调函数的结果。避免这种情况的一种常见方法是在回调之前将this
分配给另一个变量,以便获得以下内容:
bindings: function() {
var that = this;
this.clearButton.on('click', function(e) {
e.preventDefault();
that.clearName();
});
}
同样适用于ajaxSuccessCallback。
答案 1 :(得分:1)
由于该方法的执行上下文,一种可能的解决方案是使用Function.bind() / $.proxy()之类的
this.clearButton.on('click', $.proxy(function (e) {
e.preventDefault();
OptionsForm.clearName();
}, this));
而不只是传递ajaxSuccessCallBack
,传递$.proxy(this.ajaxSuccessCallBack, this)
答案 2 :(得分:0)
是的,这些是经典解决方案的经典问题。在你的按钮情况下,它完全与执行上下文有关:当“点击”被触发时,“this”究竟是什么意思。
jQuery,Dojo或angularJS等框架会有所帮助。我建议使用框架,因为它们可以帮助解决更大的问题,例如组织应用程序代码以及解决这些问题。
答案 3 :(得分:-1)
你这样做绝对正确。
JavaScript中this
的值取决于执行的当前上下文而不是函数上下文。
例如:
var showContext = function() {
console.log(this); // will log window
}
showContext()
与window.showContext()
相同,因为当前上下文为window
,并且函数showContext
已定义到窗口。
让我们考虑另一个例子: var obj = {name:&#39; stackoverflow&#39;}; obj.showContext = function(){ 的console.log(this.name); }
var name = 'stackexchange';
var fun = obj.showContext;
obj.showContext(); // stackoverflow
fun(); //stackexchange
当function
作为callback
传递给event
时,context
的{{1}}(或this
}是由function
执行后element
所附加的event
。
你的代码绝对没问题。但是你可能觉得使用{/ 1}}表示法很奇怪,如
event
您可以将功能修改为
Object.function()
我已根据上述代码更新了小提琴,请找到它here