Функция внутри метода 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;

 }); 

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