我有一个工厂的房子
'使用严格';
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- 我确实设置了它,但当我切换到一个页面重用该数字时,我undefined在Owner控制器中收到一条消息.
为何清除价值?似乎House的另一个例子被转移了.有人可以帮忙吗?
这是因为您将私有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)