我在一个控制器中有以下代码。
$scope.DataModel= [];
$scope.DataModelTexts= { buttonDefaultText: '' };
我将在另一个控制器中使用相同的代码。现在,我不想在第二个控制器中编写相同的代码,我想知道是否有办法将它放在某个工厂或服务中的公共代码中,并在两个控制器中使用它。我试着阅读有关工厂和服务的内容,我对如何在我的场景中使用其中任何一个感到困惑。
任何信息都可以帮助我获得有关angularjs工厂和服务的更多知识。谢谢。
答案 0 :(得分:1)
您正走在正确的轨道上,使用可以使用工厂或服务在控制器之间共享代码。请注意,角度服务(和工厂)是单身人士;它们在应用程序启动时被实例化,然后无论何时将其注入控制器,您都会引用相同的实例。请考虑以下代码:
var myApp = angular.module('myApp',[]);
myApp.service('MyService', function() {
let _someValue = 'Initial Value';
this.setValue = function(value){
_someValue = value;
}
this.getValue = function(){
return _someValue;
}
});
//First Controller Run
myApp.controller('ControllerA', function($scope, MyService) {
MyService.getValue(); //Initial Value
MyService.setValue("BRAND NEW VALUE!!!");
});
//Run after ControllerA
myApp.controller('ControllerB', function($scope, MyService) {
MyService.getValue(); //BRAND NEW VALUE!!!
});
她,你会看到MyService保持someValue的状态。 ControllerA将MyService注入其中,并可以使用该服务的方法来设置新值。现在,对于同一状态的任何后续调用,例如ControllerB,将返回更新的值。
答案 1 :(得分:0)
您可以使用.config()
或run()
块(这里有好的SO:AngularJS app.run() documentation?)将这些重用的变量绑定到$ rootScope,然后从{{1}调用它们来自您的控制器或服务中的{和$rootScope.DataModel
(只要您将$ rootScope注入这些控制器和服务中)。