2014-01-06 6 views
10

У меня есть одно сомнение относительно заводского каталога угловых js.Функция внутри метод фабрики может сообщить

Предположим, что это каталог fact1. Я хочу вызвать метод funct1 внутри метода funct2.

app.factory("fact1",function(){ 
    return{ 
    funct1:function(){ 
     //some code here 
    },funct2:function(){ 
     //some code here 
     // call here funct1() 
    } 
    } 
}); 

Сначала скажите мне, что это возможно или нет? если возможно, то как я могу вызвать метод funct1 внутри метода funct2.

ответ

11

Почему бы не сделать что-то вроде этого:

app.factory("fact1",function(){ 

    function funct1() { 
     // Do some code... 
    } 

    function funct2() { 
     // Do some code... 
     funct1(); 
    } 

    return{ 
     funct1: funct1, 
     funct2: funct2 
    }; 
}); 

Я лично нашел этот путь чтобы быть гораздо более удобными и удобочитаемыми, чем сбрасывать каждую функцию в моем возвратном объекте. Кроме того, я не большой поклонник использования this в моих возвращаемых объектах.

+0

Это должен быть принятый ответ –

+0

Более читаемый и избегает всех головных болей ключевого слова this. – georgeawg

+0

Я не понимаю, что вы подразумеваете, они вводят «b» в «это»? – gonzofish

10

Уверен, это возможно. Это просто нормальное использование Javascript объекта:

return { 
    funct1: function() { 
     //some code here 
    }, 
    funct2: function() { 
     //some code here 
     this.funct1(); 
    } 
} 

UPD. В комментариях было немного недоразумений, что это не работает. Он делает, однако вам нужно понять, что очень важно , как называется методfunct2. А именно, метод не следует отделять от его базового объекта, иначе контекст будет другим, а this.funct1() укажет на неправильный (обычно несуществующий) метод. Обычный способ потерять контекст:

$('.something').on('click', obj.funct2); 

В вышеприведенном obj.funct2this будет объектом HTML элемент, не obj больше. Однако ниже версии будут работать должным образом:

// use anonymous function 
$('.something').on('click', function() { obj.funct2() }); 

// bind explicitly to context 
$('.something').on('click', obj.funct2.bind(obj)); 

Здесь очень важно понять MDN статья: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

+4

это не работает – electricfeel1979

+1

Да, не работает - не знаю, почему его правильный ответ. это сработало для вас @Mayur – David

+0

@David Правильный код. Однако вы можете использовать его неправильно. Дайте мне фрагмент того, как вы вызываете «func2» в вашем случае, и я расскажу вам, почему он не работает. – dfsq

1

Вместо непосредственного возвращения на заводе, вы можете сделать что-то вроде этого:

app.factory("fact1",function(){ 
    var obj = {}; 

    obj.funct1 = function(){ 
     //some code here 
    } 

    obj.funct2 = function(){ 
     //some code here 
     // call here funct1() 
     obj.funct1();/* calling the funct1 */ 
    } 
    return obj; 

}); 

Это должно работать для вас.

Смежные вопросы