我有两个控制器,其中一个我声明了一个$ scope变量,我想在第二个控制器中看到它。
第一个控制器
app.controller('Ctrl1', function ($scope) {
$scope.variable1 = "One";
});
第二个控制器
app.controller('Ctrl2', function ($scope, share) {
console.log("shared variable " + share.getVariable());
});
我研究了最好的Angular方法,我发现这是使用服务。所以我为Ctrl1
服务
.service('share', function ($scope) {
return {
getVariable: function () {
return $scope.variable1;
}
};
});
此代码返回此错误:
Unknown provider: $scopeProvider <- $scope <- share
所以我的问题是:可能在控制器之间共享$ scope变量吗?是不是最好的Angular解决方案还是我错过了什么?
对不起我的琐碎问题,但我是一名Angular初学者。
提前致谢
此致
答案 0 :(得分:5)
是的,可以通过服务和工厂在控制器之间共享范围变量。但是,$ scope变量是控制器本身的本地变量,并且服务无法知道该特定变量。我更喜欢使用工厂,黄油容易和光滑。如果您在单独的文件中使用工厂服务,则需要在index.html中包含该文件
app.controller('Ctrl1', function ($scope,myService,$state) {
$scope.variable1 = "One";
myService.set($scope.variable1);
$state.go('app.thepagewhereyouwanttoshare');//go to the page where you want to share that variable.
});
app.controller('Ctrl2', function ($scope, myService) {
console.log("shared variable " + myService.get());
});
.factory('myService', function() {
function set(data) {
products = data;
}
function get() {
return products;
}
return {
set: set,
get: get
}
})
答案 1 :(得分:2)
您不能在服务工厂函数中注入vm.username
依赖项。
基本上可共享的服务应该在某个对象中维护可共享的数据。
<强>服务强>
$scope
<强>控制器强>
.service('share', function () {
var self = this;
//private shared variable
var sharedVariables = { };
self.getSharedVariables = getSharedVariables;
self.setVariable = setVariable;
//function declarations
function getSharedVariables() {
return sharedVariables;
}
function setVariable() {
sharedVariables[paramName] = value;
}
});
答案 2 :(得分:0)
更新: 使用$ rootScope被视为不良做法。
您需要的是$rootScope
。 $scope
仅适用于一个控制器。这是一个例子:
angular.module('myApp', [])
.run(function($rootScope) {
$rootScope.test = new Date();
})
.controller('myCtrl', function($scope, $rootScope) {
$scope.change = function() {
$scope.test = new Date();
};
$scope.getOrig = function() {
return $rootScope.test;
};
})
.controller('myCtrl2', function($scope, $rootScope) {
$scope.change = function() {
$scope.test = new Date();
};
$scope.changeRs = function() {
$rootScope.test = new Date();
};
$scope.getOrig = function() {
return $rootScope.test;
};
});
答案 3 :(得分:0)
您尝试使用服务非常好,但您不应该尝试在服务代码中使用$ scope依赖注入。服务是您的数据提供者,如果您想在两个控制器之间共享一些数据,您应该在服务中为这些数据添加
.service('share', function ($scope) {
this.variable1 = '';
return {
getVariable: function () {
return this.variable1;
}
setVariable(variable)
{
this.variable1 = variable;
}
};
});
app.controller('Ctrl1', function (share) {
$scope.variable1 = share.getVariable();
});
这是对此解决方案的更广泛描述: https://stackoverflow.com/a/21920241/4772988
答案 4 :(得分:0)
最好的办法是使用服务。服务只能访问$rootScope
,他们没有自己的$scope
。
但是,您不应该使用范围来执行此任务。只需在任何范围之外使用某个共享变量进行服务。
.service('share', function ($scope) {
var variable = 42;
return {
getVariable: function () {
return variable;
}
};
});
app.controller('Ctrl', function ($scope, share) {
console.log("shared variable " + share.getVariable());
// Watch for changes in the service property
$scope.$watch(function() { return share.getVariable(); }, function(oldValue, newValue) {
// whatever
});
});
答案 5 :(得分:0)
首先,您的服务应该是这样的:
app.service('share', function () {
// this is a private variable
var variable1;
return {
// this function get/sets the value of the private variable variable1
variable1: function (newValue) {
if(newValue) variable1 = newValue;
return variable1;
}
};
});
设置共享变量的值会将值传递给我们在服务上创建的函数
app.controller('Ctrl1', function ($scope, share) {
$scope.variable1 = "One";
// share the value of $scope.variable1
share.variable1($scope.variable1);
});
要获取共享变量的值,还要使用服务中的函数而不传递值
app.controller('Ctrl2', function ($scope, share) {
console.log("shared variable " + share.variable1());
});