我在工厂有两个功能
这是一些代码
.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的值时。这显示未定义。
有什么想法吗?怎么做?
由于
答案 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();