工厂流程。它是如何运作的

时间:2016-05-06 20:36:14

标签: angularjs

自从我开始使用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>

1 个答案:

答案 0 :(得分:3)

  

每个返回函数内部的代码在其他任何内容之前进行评估

当然,因为_somefunc()执行它。

应该是:

return  {
  x: _x,
  changeX: _somefunc
}

请注意,()之后应该没有_somefunc,这是调用运算符。您希望changeX成为_somefunc的引用,而不是_somefunc执行结果(_somefunc())。