JavaScript: MooTools - получить строку с классом, вернуть ее с помощью родительской функции - PullRequest
1 голос
/ 12 августа 2011

У меня большая проблема, и я не знаю, как ее решить.

Мне нужно возвращать значения (в основном, строки), чтобы использовать их в различных контекстах. В качестве примера мне нужно проверить, является ли что-то 0 или 1 в операторе if / else или вставить строку в различные html-элементы, прежде чем анализировать это через JavaScript в DOM. Вот упрощенный пример того, что я ищу:

<script>
    function output() {
        return "Hello world!";
    }

    function check() {
        return 3;
    }

    (function() {
        if(check() !== 5) {
            $(someElement).set("html", "<p>" + output() + "</p>");
        }
    })();
</script>

Теперь давайте перейдем к головной части: перед возвратом значения мне нужно запросить его из контекста JSON во внешнем файле, который загружает содержимое из серверной части. Я написал класс, который содержит класс Request.JSON MooTools, чтобы его было проще использовать с различными запросами:

<script>
    var backendCall = new Class({

        Implements: Options,

        options: {
            url: "gateway/?contentType=application/json"
        },

        initialize: function(options) {
            this.setOptions(options);

            if(!instanceOf(this.options.prms, Array)) {
                this.options.prms = [];
            }

            this.fire();
        },

        fire: function() {
            new Request.JSON({
                data: JSON.encode({
                    "methodName": this.options.req,
                    "parameters": this.options.prms,
                    "serviceName": this.options.srv
                }),
                onFailure: function() {
                    alert("JSON-Request failed.");
                },
                onSuccess: function(data) {
                    this.callback(data);
                }.bind(this),
                url: this.options.url
            }).send();
        },

        callback: function(data) {
            alert(data); // works
        }
    });


    function request(req, srv) {
        new backendCall({
            req: req,
            srv: srv
        });
    }


    window.addEvent("load", function() {
        /* is there a way to return the data string here?
            or is it impossible? */
        request("someValue", "demoTest");
    });
</script>

Это прекрасно работает при выполнении жестко закодированной функции внутри функции обратного вызова, которая ссылается на вывод JSON-запроса. Но мне нужно сделать эту часть более переменной, потому что я хочу использовать вывод по-разному. Есть ли способ позволить обратному вызову просто вернуть вывод и передать его в родительскую функцию request (), чтобы он мог вернуть значение? Может быть с .pass (data)? Любые идеи приветствуются! Спасибо вам большое! :)

1 Ответ

0 голосов
/ 12 августа 2011

хорошо.XHR является асинхронным (ajax), поэтому вы можете получить значение в качестве обратного вызова только для события onComplete.

Обычно вы ожидаете ответа, и onComplete может перейти к следующему элементу, который вы проверяете илиfinalize.

например, в псевдокоде:

form.addEvent("submit", function(e) {
    e.stop();
    var errors = false;
    var finalise = function() {
        if (!errors)
            this.send();
        else 
            alert("errors found!");
    }.bind(this);

    if (!field.length) errors = true;
    ... other sync checks.
    // does it exist?
    new Request.JSON({
        url: "/accountCheck/",
        method: "get",
        onComplete: function(data) {
            if (data.id) {
                 // already exists
                 errors = true;
            }
            // call finalise
            finalise();
        }
    }).send({user: field.value}); 
}

, конечно, вы можете установить async: false для объекта запроса, который будет блокировать пользовательский интерфейс до его завершения, чтобы onComplete мог установитьваш var и строка сразу после Request.send () будут доступны для использования.

вы можете сделать правильный валидатор (или использовать готовый), который определяет набор правил и проверяет их по порядку,Понимание async onComplete и наличие стека проверок для работы, есть много примеров этого, и даже у mootools-more есть довольно большой валидатор форм (хотя я сам не использовал его, поэтому не могу засвидетельствовать, как он работает с асинхронными проверками).)

...