Ненавязчивый JavaScript ajax с mootools? - PullRequest
0 голосов
/ 27 декабря 2011

Ненавязчивый JavaScript с jQuery доступен в MVC3. Но как я могу использовать ненавязчивый ajax Javascript с mootools?

1 Ответ

1 голос
/ 27 декабря 2011

да, это тривиально.взгляните на недавно выпущенный http://mootools.net/blog/2011/12/20/mootools-behavior/, Я думаю, что он поддерживает его.

Я использовал этот подход в моем Modal.BootStrap (просмотреть исходный код на github, ссылка там)Кроме того, когда он использует атрибуты данных для извлечения данных из ресурса AJAX, это не совсем то же самое, но, безусловно, это начало.

Я просто потратил 10 минут, чтобы сделать это, и это хорошее начало:

http://jsfiddle.net/dimitar/zYLtQ/

(function() {

    var ajaxify = this.ajaxify = new Class({

        Implements: [Options,Events],

        options: {
            mask: "form[data-ajax=true]",
            props: {
                ajaxLoading: "data-ajax-loading",
                ajaxMode: "data-ajax-mode",
                ajaxUpdate: "data-ajax-update",
                ajaxSuccessEvent: "data-event-success"
            }  
        },

        initialize: function(options) {
            this.setOptions(options);
            this.elements = document.getElements(this.options.mask);
            this.attachEvents();
        },

        attachEvents: function() {
            this.elements.each(function(form) {
                var props = {};
                Object.each(this.options.props, function(value, key) {
                    props[key] = form.get(value) || "";
                });

                form.store("props", props);
                form.addEvent("submit", this.handleSubmit.bind(this));
            }, this);

        },

        handleSubmit: function(e) {
            e && e.stop && e.stop();
            var form = e.target, props = form.retrieve("props"), self = this;
            var updateTarget = document.getElement(props.ajaxUpdate);

            new Request({
                url: form.get("action"),
                data: form,
                onRequest: function() {
                    if (props.ajaxLoading) {
                        var loading = document.getElement(props.ajaxLoading);
                        if (loading && updateTarget) {
                            updateTarget.set("html", loading.get("html"));
                        }

                    }
                },
                onSuccess: function() {                             
                    if (!updateTarget)
                       return;

                    if(props.ajaxMode != 'append') {
                        updateTarget.set("html", this.response.text);
                    }
                    else {
                        updateTarget.adopt(new Element("div", { html: this.response.text }));
                    }     

                    if (props.ajaxSuccessEvent)
                        self.fireEvent(props.ajaxSuccessEvent, this.response);       
                }

            }).send();

        }

    });

})();


new ajaxify({
    onContactFormSuccess: function(responseObj) {
        console.log(responseObj.text);
        alert("we are done.");
    }
});

работает с DOM:

<form action="/echo/html/" data-ajax="true"  data-ajax-loading="#loading" data-ajax-mode="replace" data-ajax-update="#update" data-event-success="contactFormSuccess" method="post">
    <input name="delay" value="4" type="hidden" />
    <input name="html" value="Thanks for your submission, this is the jsfiddle testing response" type="hidden" />
    <input name="name" placeholder="your name" />
    <button>submit</button>
</form>

<div id="update">The update will go here.</div>  
<div id="loading">loading...</div>        

, на котором вы сможете это сделать.в рефакторинге я бы переместил события запроса в их собственные методы и добавил еще несколько проверок и т. д., но это нормально.Я не знаю, все, что делает MVC, но одна вещь, которая отсутствует, это события проверки формы.я также добавил пользовательское событие, которое вызывается, когда это делается, чтобы ваш экземпляр ajaxifier мог сделать что-то конкретное с этой формой (см. data-event-success="contactFormSuccess")

, также он может использовать параметры запроса по умолчанию, если не указано явно, даже какой запрособъект для создания - Request, Request.HTML, Request.JSON и т. д. Также возможны такие события, как onRequest, spinner и т. д. Я думаю, что вам просто нужно пройтись по опциям, предоставляемым mvc, и собрать их, чтобы начать.

Confirm     data-ajax-confirm
HttpMethod  data-ajax-method
InsertionMode   data-ajax-mode *
LoadingElementDuration  data-ajax-loading-duration **
LoadingElementId    data-ajax-loading
OnBegin     data-ajax-begin
OnComplete  data-ajax-complete
OnFailure   data-ajax-failure
OnSuccess   data-ajax-success
UpdateTargetId  data-ajax-update
Url     data-ajax-url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...