所以,我是一名java开发人员,试图不在javascript中编写太多的java代码。我已经阅读了有关javascript的各种资源(例如http://chimera.labs.oreilly.com/books/1234000000262/ch04.html),但我仍然无法找到一个干净利落的方法来做到这一点。
所以,基本问题是:
所以,这是迄今为止部分有效的解决方案。 我在调用ajax成功回调函数时遇到问题。如果我尝试使用'this',它就有错误的上下文。我可以将它存储在另一个变量中(比如'that'),但这肯定会很好。
此外,我不太确定这段代码看起来那么好,考虑到我在上面提到的书中所读到的
function DeleteHandler() {
var obj = {
init: function () {
_.bindAll(this, 'render', 'close', 'submit');
this.$main = $('#main');
// get underscore template
this._template = _.template($('#delete-template').html());
// bind function to delete button
this.$main.on('click', '.delete', this.render);
},
render: function(e) {
e.preventDefault();
//render the template and bind button actions
this.$content = $(this._template({title: 'moe'}));
this.$content.on('click', '.ok', this.submit);
this.$content.modal('show');
this.$endpoint = $(e.target).attr('endpoint');
},
close: function () {
this.$content.modal('hide');
},
submit: function() {
$.ajax({
url: this.$endpoint,
type: 'DELETE',
success: function(data,textStatus){
// call close function here! but how?!?
},
});
}
}
return obj;
};
现在我可以使用这样的东西
<span class="delete" endpoint='http://....'>delete</span>
<script type="text/javascript">
$(function($) {
DeleteHandler().init();
});
</script>
如果我能像这样调用我的函数,我会很高兴:
DeleteHandler.init();
这可能吗?我将在页面上多次使用此函数,因此我不能只使用文字而不是函数。
修改 我找到了一些解决方法来使ajax回调发生: 您可以将上下文传递给jquery ajax文字:
如果我使用这样的东西:
$.ajax({
url: this.$endpoint,
type: 'DELETE',
context: this,
success: function(data,textStatus){this.$update.html(data); this.close();},
}
我实际上可以在成功回调中调用this.close()。可能不是一个非常好的解决方案。但也许有人有更好的主意?
答案 0 :(得分:1)
您已经通过DeleteHandler函数将其包装在对象中(函数在技术上是对象)。您可以在DeleteHandler函数中声明一个Init函数并调用它来代替使用var obj ...
function DeleteHandler() {
// Declare the Init function inside our DeleteHandler object
function Init() {do stuff...};
// Declare your other functions and 'stuff'
function render() {...};
// Now call the function.
Init();
};
至于创建和使用你的对象,它看起来更像是这样:
<span class="delete" endpoint='http://....'>delete</span>
<script type="text/javascript">
$(function($) {
DeleteHandler();
});
</script>