Изменение встроенного текста не обновляется по запросу ajax (но изменяется по БД) - PullRequest
1 голос
/ 21 июня 2011

Я использую скрипт, который я нашел для изменения строки текста на ходу (вы нажимаете на нее, и ввод показывает).Он работает нормально, ничего не делая с базой данных, но когда я добавляю свой код для обновления, он обновит базу данных, но не обновит текст после отправки.Я полностью потерян, так как я уже несколько часов, может быть, я упускаю что-то очень простое.

Мой JS:

$.ajaxSetup({
    url: '/ajax/nombreruta.php',
    type: 'POST',
    async: false,
    timeout: 500
});



$('.editable').inlineEdit({
    value: $.ajax({ data: { 'action': 'get' } }).responseText,
    buttons: '',
    cancelOnBlur: true,
    save: function(event, data) {
        var html = $.ajax({
            data: { 'action': 'save', 'value': data.value }
        }).responseText;

        //alert("id: " + this.id );

        return html === 'OK' ? true : false;
    }
});

nombreruta.php:

<?php session_start();

$action = isset($_POST) && $_POST['action'] ? $_POST['action'] : 'get';
$value  = isset($_POST) && $_POST['value'] ? $_POST['value'] : '';

include $_SERVER['DOCUMENT_ROOT'] ."/util-funciones.php";//for my db functions

$cnx=conectar();
$sel="select * from ruta where id_ruta='".$_SESSION['ruta']."'";

$field=mysql_query($sel, $cnx);
if($row=mysql_fetch_object($field)){
$data = $row->nombre;
}

switch ($action) {

// retrieve data
case 'get':
    echo $data;
    break;

// save data
case 'save':
    if ($value != '') {


        $sel="update ruta set nombre='".$value."' where id_ruta=".$_SESSION['ruta'];
        mysql_query($sel,$cnx) or die(mysql_error());

        $_SESSION['data'] = $value;

        echo "OK";
    } else {
        echo "ERROR: no se han recibido valores.";
    }
    break;

// no action
default:
    echo "ERROR: no se ha especificado accion.";
    break;
}

Firebug показывает мне, что после того, как я обновляю свой текст, он возвращает OK, и после того, как я обновляю сайт, он покажет обновленный текст, но не раньше.Я начал думать, что этот подход слишком хлопотный, но после стольких часов я чувствую, что я в шаге от своего решения ...

РЕДАКТИРОВАТЬ:

Я использую этот плагин: http://yelotofu.com/2009/08/jquery-inline-edit-tutorial/

И мой HTML просто

 <span class="editable">Text</span>

1 Ответ

1 голос
/ 21 июня 2011

Ваш код отлично работает для меня ....

Вот демонстрационное приложение, которое я собрал (asp.net, но в основном то же самое, за исключением базы данных).

Просто для ясности: нажмите Enter, чтобы сохранить. Нажмите, чтобы отменить (так как вы удалили кнопки).

HTML

<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
    <script type="text/javascript" src="https://raw.github.com/caphun/jquery.inlineedit/master/jquery.inlineedit.js"></script>
    <script type="text/javascript">
        $(function(){
            $.ajaxSetup({
                url: 'Test.ashx?' + window.location.search.substring(1),
                type: 'POST',
                async: false,
                timeout: 500
            });

            $('.editable').inlineEdit({
                value: $.ajax({ data: { 'action': 'get'} }).responseText,
                buttons: '',
                cancelOnBlur: true,
                save: function (event, data) {
                    var html = $.ajax({
                        data: { 'action': 'save', 'value': data.value }
                    }).responseText;
                    return html === 'OK' ? true : false;
                }
            });
        });
    </script>
  </head>
  <body>
    <span class="editable">Test 1</span>
  </body>
</html>    

C #

public void ProcessRequest(HttpContext context)
{
    //Custom Object to Get and Format my Connection String from the URL
    QueryStringObjects QSO = new QueryStringObjects(context.Request, "InlineAjaxTest");

    //Look for any GET or POST params named 'action'
    switch (context.Request.Params["action"])
    {
        //If 'action' = 'save' then....
        case "save":
            //Open a connection to my database (This is a custom Database object)
            using (DataBrokerSql SQL = GetDataBroker(QSO.Connstring))
            {
                //Create a SQL parameter for the value of the text box
                DbParameter[] Params = {
                    new SqlParameter("@val", context.Request.Params["value"])
                };
                //Execute an Insert or Update
                SQL.ExecSQL(@"UPDATE
                                    Test_InlineAJAX
                                SET
                                    Value = @val
                                IF @@ROWCOUNT=0
                                    INSERT INTO
                                    Test_InlineAJAX
                                    VALUES
                                    (@val)", Params);

            }
            //Return OK to the browser
            context.Response.Write("OK");
            break;
        default:
            //Open a connection to my database
            using (DataBrokerSql SQL = GetDataBroker(QSO.Connstring))
            {
                //Get Value from my table (there's only one row so no need to filter)
                object obj = SQL.GetScalar("Select Value From Test_InlineAJAX");
                //If my value is null return "" if not return the value of the object
                context.Response.Write(obj != null ? obj.ToString() : "");
            }
            break;
    }
}

SQL

CREATE TABLE [dbo].[Test_InlineAJAX](
    [Value] [varchar](255) NULL
) ON [PRIMARY]

Не уверен, что еще сказать вам, но, может быть, что-то здесь даст вам идею ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...