在控制器之间共享数据:服务还是价值?
Sharing Data between controllers : Service or Value?
要在 controllers
之间共享数据,大多数 Stack overflow 答案建议使用 services
。大多数情况下,当我在 controllers
之间共享数据时,它是我的应用程序模型(数据),它会根据应用程序逻辑在每个 controller
中发生变化。那么,它不应该是 angular value
而不是 angular service
吗?
例如取下面的service
、
app.factory('Employee',function($http){
function Employee(){
this.data = {};
}
Employee.prototype.load = function(){
//XHR call which invokes employee details and assigns it here
$http.get(url).then(
function(response){
this.data = response.data;
}
);
}
return new Employee();
});
有了这项服务,我将无法在 ui-router
的 resolve
期间 inject
我的 Employee
模型(因为 services
不能被注入 config
区块)。但是,如果我使用 value
创建相同的内容,我将能够在 stateRouting
本身期间注入它。你能告诉我为什么 value
不适合在 controllers
和 service
之间创建 models/share 数据吗?
首先,值也不能注入到配置块中。但这无关紧要,因为解析函数不会在配置阶段调用,而是在运行时,每次导航到封闭路由时调用。
根本无法注入值,所以我真的不知道在定义值时如何访问 $http。
最后,您可以在解析函数中访问您的服务,只需将其注入函数即可:
resolve: {
employee: function(Employee) {
return Employee.load();
}
}
但这没有多大意义,因为您的 load() 方法没有 return 任何东西。它应该做的是returning员工的承诺:
Employee.prototype.load = function(){
return $http.get(url).then(
function(response) {
return response.data;
}
);
};
但这与控制器之间共享数据无关。它允许做的是等待员工数据可用并在切换到员工视图之前将其注入控制器。
要在 controllers
之间共享数据,大多数 Stack overflow 答案建议使用 services
。大多数情况下,当我在 controllers
之间共享数据时,它是我的应用程序模型(数据),它会根据应用程序逻辑在每个 controller
中发生变化。那么,它不应该是 angular value
而不是 angular service
吗?
例如取下面的service
、
app.factory('Employee',function($http){
function Employee(){
this.data = {};
}
Employee.prototype.load = function(){
//XHR call which invokes employee details and assigns it here
$http.get(url).then(
function(response){
this.data = response.data;
}
);
}
return new Employee();
});
有了这项服务,我将无法在 ui-router
的 resolve
期间 inject
我的 Employee
模型(因为 services
不能被注入 config
区块)。但是,如果我使用 value
创建相同的内容,我将能够在 stateRouting
本身期间注入它。你能告诉我为什么 value
不适合在 controllers
和 service
之间创建 models/share 数据吗?
首先,值也不能注入到配置块中。但这无关紧要,因为解析函数不会在配置阶段调用,而是在运行时,每次导航到封闭路由时调用。
根本无法注入值,所以我真的不知道在定义值时如何访问 $http。
最后,您可以在解析函数中访问您的服务,只需将其注入函数即可:
resolve: {
employee: function(Employee) {
return Employee.load();
}
}
但这没有多大意义,因为您的 load() 方法没有 return 任何东西。它应该做的是returning员工的承诺:
Employee.prototype.load = function(){
return $http.get(url).then(
function(response) {
return response.data;
}
);
};
但这与控制器之间共享数据无关。它允许做的是等待员工数据可用并在切换到员工视图之前将其注入控制器。