Question

J'ai un problème avec le javascript ci-dessous dans lequel le $.ajax L'appel n'est pas appelé. La alert('foo') Cela se produit, mais alors l'appel de données est complètement sauté et le rappel n'est jamais atteint (ne jamais obtenir alert('success!'). Je ne comprends pas complètement les rappels, mais cela semble que cela devrait fonctionner.

Éditer

Édité le script à l'endroit où je me tiens actuellement, car je l'ai lu de cette façon est une meilleure pratique. Pourtant, je peux intervenir authenticate(), ça se brise url:[...], mais ne fait jamais réellement l'appel Ajax. J'ai essayé de supprimer le retour juste pour voir si c'est le problème, mais cela produit le même résultat.

define(["jQuery", "kendo", "modernizr", "app/environment"], function ($, kendo, modernizr, environment) {
    var authenticate = function (username, password) {
        return $.ajax({
            url: environment.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
            type: 'get',
            dataType: 'jsonp'
        });
    }

    var canLogin = function(data) {
        alert('good');
    }

    return {
        viewModel: kendo.observable({
            username: null,
            password: null,
            authenticate: function () {
                var username = this.get('username'),
                    password = this.get('password');

                authenticate(username, password).done(canLogin);
            }
        })
    }
});
Était-ce utile?

La solution 2

La solution est un mélange de e.preventDefault() et en utilisant un rappel dans l'appel AJAX. L'utilisation du rappel n'a pas résolu le problème, mais l'ajout preventDefault au authenticate fonction et résolution du problème de rappel.

La version finale et fonctionnelle ressemble maintenant à ceci:

define(["jQuery", "kendo", "modernizr", "app/environment"], function ($, kendo, modernizr, environment) {
    function authenticate(username, password, callback) {
        $.ajax({
            url: environment.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
            type: 'get',
            dataType: 'jsonp',
            success: callback,
            error: function (x,t,r) {
                console.log('error')
            }
        });
    }

    function login(canLogin, username, password) {
        if (canLogin == false) {
            alert('Incorrect username or password');
            return;
        }

        alert('good');
    }

    return {
        viewModel: kendo.observable({
            username: null,
            password: null,
            authenticate: function (e) {
                e.preventDefault();
                var username = this.get('username'),
                    password = this.get('password');

                authenticate(username, password, function (canLogin) {
                    login(canLogin, username, password);
                });
            }
        })
    }
});

Autres conseils

Utilisez un rappel à la place.

var canLogin = function (username, password, callback) {
    $.ajax({
        async: false,
        url: config.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
        type: 'GET',
        dataType: 'jsonp',
        error: function (x, t, r) {
            alert('Error');
        },
        success: callback
    });

}

// use
canLogin("user","passwd",function( data ){
    alert("Im called on authentication success!");
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top