Pregunta

Tengo un problema con el JavaScript a continuación en el que el $.ajax la llamada no se llama. los alert('foo') sucede, pero luego la llamada de datos se omite por completo y la devolución de llamada nunca se alcanza (nunca obtenga alert('success!'). No entiendo completamente las devoluciones de llamada, pero parece que debería estar funcionando.

Editar

Edité el guión a donde estoy actualmente, como he leído de esta manera, es una mejor práctica. Aún así, puedo intervenir authenticate(), se rompe url:[...], pero entonces nunca hace la llamada Ajax. Intenté eliminar el regreso solo para ver si ese es el problema, pero está produciendo el mismo resultado.

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);
            }
        })
    }
});
¿Fue útil?

Solución 2

La solución es una mezcla de e.preventDefault() y usando una devolución de llamada en la llamada AJAX. El solo uso de la devolución de llamada no resolvió el problema, pero agregó preventDefault hacia authenticate función y solucionar el problema de devolución de llamada lo hizo.

La versión final de trabajo, ahora se parece a esto:

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);
                });
            }
        })
    }
});

Otros consejos

Use una devolución de llamada en su lugar.

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!");
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top