Почему этот массив не возвращается должным образом из JavaScript-класса - PullRequest
0 голосов
/ 09 ноября 2010

Я говорю «класс», потому что технически классы не существуют в JS. Но вот мой упрощенный класс

function clsDragStack(divWithin,divConstrain,arrOptions){
    var _divWithin,_divCont,_divOption,_arrOptions;
    var _sourceStack=[];    // array to hold jQuery items referencing remaining source items. initally ALL items will be in this array.
    var _selectStack=[];    // array to hold jQuery items referencing items the user has selected.

    //start constructor

    _divWithin=divWithin;
    _arrOptions=arrOptions;
    _divCont = $('div[ID^="divContainer"]',divWithin);
    _divOption = $('div[ID^="divOption"]',divWithin);;

    initDraggables(divConstrain);

    //end constructor

    function initDraggables(divConstrain){
        var divDraggables = $(".draggableBasic",_divCont);                              //get all the draggable divs
        divDraggables.each(function(i){_sourceStack.push($(this));});          //add all the children to sourcestack
    };

    clsDragStack.prototype.selected = function (){
        return _selectStack;
    };
};

Это, вероятно, не принесет ничего полезного в отдельности, но показывает интересующие вас кусочки. По сути, у меня есть столбец слева (представлен в классе _sourceStack) Пользователь может перетаскивать элементы отсюда в другой столбец (представлен _selectStack). Все это прекрасно работает, массивы _sourceStack и _selectStack перемещаются довольно счастливо. Однако, когда я пытаюсь получить доступ к содержимому _selectStack извне класса, используя ...

        var arrFields=selectStack.selected();

... например - я, кажется, всегда получаю оригинальный стек, т.е. пустой. Если я пытаюсь получить доступ к _sourceStack таким же образом, я получаю исходный полный список, как будто никакие элементы не были перемещены. Я могу видеть, как изменяются _sourceStack и _selectStack при перемещении элементов.

Нужно ли делать копию массива в selected () перед передачей , что назад? Почему я не могу передать ссылку на этот объект? Я провел эксперимент с простыми строковыми массивами, и он отлично работает. Это потому, что это массивы объектов jQuery?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

Хорошо. Вот как я это сделал. Я заменил ...

clsDragStack.prototype.selected = function (){
    return _selectStack;
};

с ...

return {
    selected : function(){
        return _selectStack;
    }
};

.. все еще в основной части класса.

Если кто-нибудь сможет мне объяснить, что, черт возьми, здесь происходит, я был бы очень благодарен! Особенно, что это за структура return {name: function(){}}; - и почему в моей первоначальной реализации она возвращала оригинальный массив, даже если он был изменен ??

0 голосов
/ 09 ноября 2010

Весь код, который я видел, определяет элементы-прототипы вне функции, например:

function clsDragStack(divWithin,divConstrain,arrOptions){
     this._selectStack=[];
     //...
};

clsDragStack.prototype = {
    selected: function() {
        return this._selectStack;
    }

};

Не должно иметь значения , что содержится в массиве.

С вашим кодом каждый раз, когда вы создаете новый объект clsDragStack, функция-прототип selected изменяется, чтобы возвращать _selectStack самого нового сгенерированного объекта.Таким образом, каждый существующий объект будет возвращать новый (пустой) массив.

...