自从我开始使用AngularJS编写代码以来,我一直在使用工厂并发现它们非常有用。 我认为他们的工作方式如此(伪代码):
FACTORY NAMESPACE {
PRIVATE FIELDS AND FUNCTIONS
RETURN {
INTERFACES TO ACCESS PRIVATE DATA
}
}
我认为 return 中的表达式仅在直接访问时进行评估,但似乎我没有把它弄好。
据我所知,工厂和服务是AngularJS的最低点,也许有人认为这个问题不应该在这里因为它是微不足道的,但是......
I created this plunk,我试图找出为什么变量在工厂代码中发生变化,之后不会保留其值,当从外部访问时,我发现的东西更加困惑我,每个返回函数内部的代码在其他任何东西之前进行求值,并且它应该被调用(按照我的逻辑)!是。是这样设计的,如果是这样,为什么?
来自plnkr的片段
var myApp = angular.module('app',[])
myApp.factory('_gl', [function () {
// Private fields
var _x;
function _somefunc(){
// This function evaluates even before the code of 'ctrl'
_x = 6;
console.log("changed:"+ _x);
}
return {
x:_x,
changeX:_somefunc()
}
}]);
myApp.controller('ctrl', ['_gl', function (_gl) {
_gl.x=2;
console.log("x init: " + _gl.x);
_gl.changeX(); // This does nothing at all
console.log("x after change: " + _gl.x);
}]);
/* Expected output
x init: 2
changed: 6
x after change:6
/*
/* Actual output
x init: 2
changed:6
x after change: 2
*/
结果:
毕竟我从@dfsq发现了(正确的方法是使用getter和setter),我得出的结论是,虽然它可以带来一些内存开销,但使用简单的JS全局变量对我来说会更好。< / p>
答案 0 :(得分:3)
每个返回函数内部的代码在其他任何内容之前进行评估
当然,因为你用_somefunc()
执行它。
应该是:
return {
x: _x,
changeX: _somefunc
}
请注意,()
之后应该没有_somefunc
,这是调用运算符。您希望changeX
成为_somefunc
的引用,而不是_somefunc
执行结果(_somefunc()
)。