Функция внутри метода factory может связываться
У меня есть одно сомнение относительно каталога factory angular js.
Предположим, что это каталог fact1. Я хочу вызвать метод funct1 внутри метода funct2.
app.factory("fact1",function(){
return{
funct1:function(){
//some code here
},funct2:function(){
//some code here
// call here funct1()
}
}
});
Сначала скажите мне, что это возможно или нет?
если возможно, то как я могу вызвать метод funct1 внутри метода funct2.
Ответы
Ответ 1
Почему бы не сделать что-то вроде этого:
app.factory("fact1",function(){
function funct1 () {
// Do some code...
}
function funct2 () {
// Do some code...
funct1();
}
return{
funct1: funct1,
funct2: funct2
};
});
Я лично нашел, что этот способ намного удобнее и удобочитаемо, чем сшить каждую функцию в моем возвращенном объекте. Кроме того, я не большой поклонник использования this
в моих возвращаемых объектах.
Ответ 2
Конечно, это возможно. Это обычное использование объектов JavaScript:
return {
funct1: function () {
//some code here
},
funct2: function () {
//some code here
this.funct1();
}
}
UPD. В комментариях было немного недоразумений, что это не работает. Он делает, однако вам нужно понять, что очень важно как метод funct2
вызывается. А именно, метод не следует отделять от него базового объекта, иначе this
контекст будет другим, а this.funct1()
укажет на неправильный (обычно несуществующий) метод. Обычный способ потерять контекст:
$('.something').on('click', obj.funct2);
В приведенном выше примере obj.funct2
this
больше будет объектом 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
Ответ 3
Вместо прямого возврата в factory вы можете сделать что-то вроде этого:
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;
});
Это должно сработать для вас.