工厂在控制器中使用时不保留数据

时间:2014-01-08 20:50:42

标签: angularjs

我有一个工厂大楼

'use strict';

myApp
.factory('House', [ '$http', '$location', '$rootScope', function($http, $location, $rootScope){

    var numberOfDoors;

    return {

        loadHouse: function(){
           numberOfDoors = 1;
        },

        numberOfDoors: numberOfDoors


    };
}]);

我有一个控制器所有者

myApp
.controller('OwnerCtrl', ['$rootScope', '$scope', '$location', 'House', function($rootScope, $scope, $location, House) {


    $scope.buildMe = function() {

        //use value from house
        var sayHelloToDoors = House.numberOfDoors;

    };
}]);

如果我在某个其他控制器中运行函数House.loadHouse()以设置变量numberOfDoors - 我确实设置了它,但是当我切换到页面以重用该数字时,我得到一个{ undefined控制器中的{1}}消息。

为何清除价值?似乎House的另一个例子被转移了。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:8)

这是因为您将私人 numberOfDoors 的值分配给工厂中的字段 numberOfDoors

// This following snippet ...

myApp.factory('house', function() {
  var numberOfDoors;

  return {
    numberOfDoors: numberOfDoors
  };
});

// ... will actually become

myApp.factory('house', function() {
  var numberOfDoors; // === undefined

  return {
    numberOfDoors: undefined
  };
});

即使您将私人 numberOfDoors 指定为初始值,它也不会按照您希望的方式运行。

myApp.factory('house', function() {
  var numberOfDoors = 123;

  return {
    loadHouse: function() {
      numberOfDoors = 1; // will change the private variable
                         // not the exposed object variable
    },
    numberOfDoors: numberOfDoors // will always be 123
  };
});

最简单的方法是做这样的事情:

myApp.factory('house', function() {

  return {
    reset: function() {
      this.numberOfDoors = 0;
    }, 
    numberOfDoors: 0
  };

});

您可以使用此plunker进行操作。

编辑:

要封装门的数量,你可以这样做:

myApp.factory('house', function() {

  var _numberOfDoors = 0;

  return {
    reset: function() {
      _numberOfDoors = 0;
    }, 
    numberOfDoors: function(value) {

      if(value!==undefined) {
        _numberOfDoors = value;
      }

      return _numberOfDoors;
    }
  };

});

现在,您可以通过控制器:

var count = house.numberOfDoors(); // Get the numberOfDoors
house.numberOfDoors(++count);      // Set the numberOfDoors

答案 1 :(得分:0)

您必须将“numberOfDoors:numberOfDoors”更改为“numberOfDoors:function(){return numberOfDoors;}”

请看这个简单的:( plnkr中提供)

var service = (function(){
  var privateVar = 0;
  return{
    updateVar: function(val){
      privateVar = val;
    },
    getVar2: privateVar,
    getVar: function(){
      return privateVar;
    }

  }
})();

var instanceA = (function(){
  service.updateVar(1);
  alert(service.getVar());

})();


var instanceB = (function(){
  alert(service.getVar());
  alert(service.getVar2);

})();