提交后的Ajax调用不会在Yii中调用正确的操作/控制器

时间:2014-04-06 17:13:27

标签: php jquery yii

在下面的jquery脚本中,我使用3个函数来创建,更新和保存 评论。当我创建一个新记录时,会调用create函数,如果我单击save,则记录 得救了。如果我刷新页面并想要更新记录,它就可以工作。 (更新然后保存功能)

但是当我想在创建/保存之后更新而不刷新页面时, 调用函数save而不是update / save。

我可能需要取消绑定事件,但它对我不起作用。 我的保存是通过点击和内部触发的,提交事件链接到一个元素。

我在某处读到这不是一个好习惯,但我读到的解决方案是触发提交 来自点击功能的事件,我试了但是它重新加载了我想避免的页面因为我正在使用 Ajax的。

修改

我放了一个跟踪,我可以看到,当我想在创建/保存之后更新时,它调用save方法但不进入方法内部,它也不会进入更新方法。调用的url包含save但具有更新调用参数。

... /blog/index.php/save

我的理解是在MVC模式中,控制器方法呈现视图。 由于在创建/保存之后呈现的最后一个视图是由保存操作控制器完成的,因此在完成之后完成提交将调用从中呈现视图的控制器。

任何见解都会受到欢迎。

$(document).ready(function() {

    $("input.switch-input:radio").click(function(e) {

            var comment = $(this).data('comment');
            var val = $(this).data('val');

            if (comment.length == 0){   // New record
                $.ajax( 
                {
                    --> call url to create new record 
                });
            }
            else if(comment !== val){
                if (confirm ("change comment?")){

                    $.ajax( 
                    {
                    --> call url to update record
                    });
                } else{
                    alert('no');
                }
            } 
    })
;

   $('body').on('click','#saveComment',function(e) {
        e.preventDefault();
        var url = $(this).val();
            $("#comment-form").submit(function(e) {
                var postData = $(this).serialize();
                $.ajax( 
                {
                    --> call url to save data
                });
                e.preventDefault(); //STOP default action
                });
            $("#comment-form").submit();
            $("#comment-form").unbind('submit');
            $("#saveComment").unbind('click');
        });

});

2 个答案:

答案 0 :(得分:0)

如果您对事件使用on,那么取消绑定它们的方法是off()。但是,如果您只希望触发一次事件,则最好使用.one()方法。

答案 1 :(得分:0)

我假设#saveComment是#comment-form中的提交按钮。在这种情况下,为什么不省去跟踪点击,阻止提交,手动触发提交等麻烦,只需先听取提交事件?

$('body').on('submit','#comment-form',function(e) {
    e.preventDefault();
    // Code to execute after the form was submitted and submission has been prevented
}

并且说过,如果你想分离它,你可以在那里做,但是你不能使用匿名函数,你必须命名它。

var submitHandler = function(e) {
    e.preventDefault();
    // Code to execute after the form was submitted and submission has been prevented
    alert("hello");

    // Detach event listener when suitable
    $("body").off('submit','#comment-form', submitHandler)
}

$('body').on('submit','#comment-form', submitHandler);

这里的工作示例:http://jsfiddle.net/K3ePW/2/