AngularJS:如何在工厂内调用函数?

时间:2015-05-28 09:06:48

标签: javascript angularjs

我在工厂有两个功能

这是一些代码

.factory('getArticles', function ($http, $q) {
   return {
       abc : function() {
        var deferred = $q.defer();
        // my code 
            res= this. bcd();
            console.log(res); // undefined
          deferred.resolve(res);

          return deferred.promise;
       },
       bcd: function() {

        //some codee 

         return res; 

       }
   }

});

现在从控制器我调用abc函数 但是当我在日志下检查res的值时。这显示未定义。

有什么想法吗?怎么做?

由于

3 个答案:

答案 0 :(得分:2)

@ Vineet的答案对于实例化的服务是正确的,但工厂应该只返回一个对象。

我喜欢@ peek4y的答案,但它可以进一步改进,仍然有abc()私有:

(function () {
'use strict';

var getArticles = function ($http, $q) {

  function bcd() {
    var res;
    // some logic
    return res;
  }

  function abc() {
    var deferred = $q.defer();
    var res = bcd();
    console.log(res); 
    deferred.resolve(res);
    return deferred.promise;
  }

  //return only the functions you want to expose

  return {
    abc: function () {
      return abc();
    }
  }
});

angular.module('myApp')
  .factory('getArticles', getArticles);

}());

答案 1 :(得分:1)

始终将问题分开。

.factory('getArticles', function ($http, $q) {

  function abc() {
    var deferred = $q.defer();
    res= bcd();
    console.log(res); 
    deferred.resolve(res);
    return deferred.promise;
  }

  function bcd() {
    //some logic
    //Make sure your logic is returning proper value.
    return res;
  }


  //return only those functions you want to expose
  return {
    abc: abc
  }
});
在return语句中,你基本上只暴露那些你会消耗的方法。

答案 2 :(得分:0)

正如luschn先生所说的那样,但您可以通过更改以下定义从控制器调用您的工厂/服务功能。您应该在工厂中使用this引用定义您的函数

.factory('getArticles', function ($http, $q) {

       this.abc = function() {
        var deferred = $q.defer();
        // my code 
            res= this. bcd();
            console.log(res); // undefined
          deferred.resolve(res);

          return deferred.promise;
       }

       this.bcd = function() {

        //some codee 

         return res; 

       }

});

在您的控制器中,您可以通过

进行呼叫
getArticles.abc()

如果您需要从其他工厂函数调用工厂的功能,只需

this.bcd();