Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов метода внутри объекта (https://javascript.ru/forum/misc/48369-vyzov-metoda-vnutri-obekta.html)

feoalter7 01.07.2014 12:12

Вызов метода внутри объекта
 
Здравствуйте! Столкнулся со следующей проблемой. Есть объект, в котором описаны методы, один из методов (count_checked_elem) формирует массив и присваивает его другому методу-объекту (res_array, массив с данными), а из третьего (submit) эти данные отправляются

control = {
        res_array: {},
        count_checked_elem: function(name){
            var res_array_temp = new Array(), self = this;
            var Elements = document.getElementsByName(name), countChecked = 0, coincidence = 0;
            
            for(var i = 0, count = Elements.length; i < Elements.length; i++){
                if(Elements[i].checked){
                    var currentElemVal = Elements[i].value;
                    res_array_temp.push(currentElemVal);
                    countChecked++;
                }
            }
            self.res_array = res_array_temp;
            alert(self.res_array); //выводит верный, сформированный массив
            return countChecked;
        },
        submit: function(){
            var self = this;
            alert(self.res_array); //выводит undefined
        }
    }


После формирования и присваивания выводит массив с данными, а из метода submit выводит undefined, почему-то думаю что дело в контексте вызова this, но не могу сам додуматься в чем ошибка..Спасибо.

рони 01.07.2014 12:49

feoalter7,
и что не так?
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>    <input name="test" type="checkbox" value="12345" checked="checked">
<script>
var control = {
        res_array: ['hmmm!'],
        count_checked_elem: function(name){
            var res_array_temp = new Array(), self = this;
            var Elements = document.getElementsByName(name), countChecked = 0, coincidence = 0;

            for(var i = 0, count = Elements.length; i < count; i++){
                if(Elements[i].checked){
                    var currentElemVal = Elements[i].value;
                    res_array_temp.push(currentElemVal);
                    countChecked++;
                }
            }
            self.res_array = res_array_temp;
            alert(self.res_array); //выводит верный, сформированный массив
            return countChecked;
        },
        submit: function(){
            var self = this;
            alert(self.res_array); //выводит тотже массив
        }
    }


  control.submit();
  control.count_checked_elem('test');
  control.submit();
</script>
</body>

</html>

feoalter7 01.07.2014 15:16

рони, вот так происходит выполнение метода submit

var submitBtn = document.getElementById('submit_control');
submitBtn.addEventListener('click', control.submit, false);


Как Вы написали, да, работает, но вот если навесить обработчик события то undefined Все равно

рони 01.07.2014 15:45

feoalter7,
на ваш выбор 2 варианта
var submitBtn = document.getElementById('submit_control');
submitBtn.addEventListener('click', function ()
{
    control.submit()
}, false);
var submitBtn = document.getElementById('submit_control');
submitBtn.addEventListener('click',  control.submit.bind(control)
, false);

feoalter7 01.07.2014 16:23

рони,
спасибо! работает! Решено.


Часовой пояс GMT +3, время: 00:10.