Понимание закрытия и объема - PullRequest
3 голосов
/ 27 января 2012

По какой-то причине (возможно, потому что я не понимаю замыкания) функция inResult всегда возвращает false, и цикл никогда не выполняется.Конечно, я уверен, что result содержит правильные свойства.

    function hasId() {return $(this).prop('id');}
    function inResult(res) { return res.hasOwnProperty($(this).prop('id'));}

    $.ajax({
        url : opt.url,
        data : $.extend(true, opt.data, {ids: ids}),
        context : this, // A collection of elements
        type : 'POST',
        dataType : 'json',
        success : function(result) {

            // Filter elements with id and with a property in result named "id"
            this.filter(hasId).filter(inResult(result)).each(function() {
                console.log($(this).prop('id'));
            });

        }
    });

РЕДАКТИРОВАТЬ : решение с рабочим кодом (спасибо Шиме Видас за то, что вы меня нашли)в правильном направлении):

// Use closures to change the context later
var hasId    = function() { return $(this).prop('id'); };
var inResult = function(res) { return res.hasOwnProperty($(this).prop('id')); };

$.ajax({
    url : opt.url,
    data : $.extend(true, opt.data, {ids: ids}),
    context : this, // A collection of elements
    type : 'POST',
    dataType : 'json',
    success : function(result) {

        // Filter elements with id and with a property in result named "id"
        var filtered = this.filter(function() {
            // Note the context switch and result parameter passing
            return hasId.call(this) && isBinded.call(this, result);
        });

        filtered.each(function() { console.log($(this).prop('id')); });

    }
});

1 Ответ

2 голосов
/ 27 января 2012

Попробуйте это:

this.filter( hasId ).filter( function () {
    return inResult( result );
}).each( function () {
    console.log( this.id );
});

В вашем коде есть .filter(inResult(result)), который не будет работать, потому что вы немедленно вызываете inResult и передаёте результат этого вызова (который является логическим значением) в filter(), который не работает с логическими значениями.


Вы также можете сделать это так:

var keys = Object.keys( result );

var filtered = this.filter( function () {
    return this.id && keys.indexOf( this.id ) > -1;
});

Object.keys( result ) возвращает массив всех собственных имен свойств из result.

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