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

Ale*_*eks 3 angularjs

我有一个工厂的房子

'使用严格';

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

    var numberOfDoors;

    return {

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

        numberOfDoors: numberOfDoors


    };
}]);
Run Code Online (Sandbox Code Playgroud)

我有一个控制器所有者

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


    $scope.buildMe = function() {

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

    };
}]);
Run Code Online (Sandbox Code Playgroud)

如果我House.loadHouse()在其他控制器中运行一个函数来设置变量numberOfDoors- 我确实设置了它,但当我切换到一个页面重用该数字时,我undefinedOwner控制器中收到一条消息.

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

nul*_*ull 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
  };
});
Run Code Online (Sandbox Code Playgroud)

即使您将私有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
  };
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

});
Run Code Online (Sandbox Code Playgroud)

你可以在这个plunker玩耍.

编辑:

要封装门的数量,您可以执行以下操作:

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

  var _numberOfDoors = 0;

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

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

      return _numberOfDoors;
    }
  };

});
Run Code Online (Sandbox Code Playgroud)

现在从你的控制器你可以:

var count = house.numberOfDoors(); // Get the numberOfDoors
house.numberOfDoors(++count);      // Set the numberOfDoors
Run Code Online (Sandbox Code Playgroud)