我有一个工厂大楼
'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的另一个例子被转移了。 有人可以帮忙吗?
答案 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);
})();