AngularJS 集中数据和 restful 服务
AngularJS centralized data with restful services
我的 AngularJS 应用程序设计需要帮助。
我有一个工厂,它为我提供 restful Web 服务的资源对象。
product.factory("productResource", function ($resource) {
var resource = $resource("/fooo/rest/products/:id", {}, {
query: {
method: "GET",
isArray: true
}
});
return resource;
});
我有一个服务,它提供了一种方法,可以查询资源工厂中的所有产品。
product.service("productDao", function (productResource) {
this.getProductModel = function () {
var data = productResource.query(function () {
});
return data;
}
});
控制器调用服务,以获取他们需要的数据:
Controller 1
header.controller("header.selection.product", function ($scope, productDao) {
$scope.products = null;
productDao.getProductModel().$promise.then(function (result) {
$scope.products = result;
});
});
Controller 2,3,4...
它们看起来几乎相同,但它们将数据用于不同的目的。
现在我不知道实现 "datasource" 的正确方法,它可以从所有控制器访问。我不想请求所有的数据,对于每个控制器启动,它应该只请求一次。
如何自动更改所有其他控制器的数据,当产品在一个控制器中更新时,该服务应该进行更新(尚未实现),当更新成功时,他们 "centralized data" 应该更改,以及所有控制器数据。
我读到有关为此目的使用 rootScope 的信息,但有人说,不要只创建 factories/services。
如果您将 $http
与缓存选项一起使用,则只有您的一个控制器会发出 "real" 请求,所有其他控制器将从缓存中获取产品。
$http.get(url, { cache: true })
或者您可以 emit
来自工厂内部的结果,让控制器听取。
getProducts: ->
url = productsApiEndPoint
$http.get(url, { cache: true })
.then(
(data) ->
$rootScope.$emit('YourFactory.getProducts', data);
(error) ->
//handle error
)
我更喜欢第一种方法。更清晰了。
您可以使用 mediator pattern 并协调数据流。创建一个将成为你的中介的服务,当数据到达时从该服务发送到你的控制器。当控制器更改数据时从控制器发送到该服务,然后服务将发送回其余控制器
在您的工厂中将数据发送到中介服务:
product.factory("productResource", function ($resource) {
var resource = $resource("/fooo/rest/products/:id", {}, {
query: {
method: "GET",
isArray: true
}
});
resource.query(...)
.$promise.then(function(products) {
$rootScope.$emit('ProductsFetched', products);
});
});
在你的中介服务上监听并发送给控制器。
product.service("productDao", function (productResource) {
$rootScope.$on('ProductsFetched', function(data){
$rootScope.$emit('ProductsChange', data);
});
$rootScope.$on('ProductsChangeFromControllers', function(data){
$rootScope.$emit('ProductsChange', data);
});
});
在你的控制器上监听并发送给中介服务:
header.controller("header.selection.product", function ($scope, productDao) {
var products = null;
$rootScope.$on('ProductsChange',function(data){
products = data;
});
// do something with the products
$rootScope.$emit('ProductsChangeFromControllers', products);
});
也许有一些语法错误,但我只是想告诉你如何构建它。
我的 AngularJS 应用程序设计需要帮助。
我有一个工厂,它为我提供 restful Web 服务的资源对象。
product.factory("productResource", function ($resource) {
var resource = $resource("/fooo/rest/products/:id", {}, {
query: {
method: "GET",
isArray: true
}
});
return resource;
});
我有一个服务,它提供了一种方法,可以查询资源工厂中的所有产品。
product.service("productDao", function (productResource) {
this.getProductModel = function () {
var data = productResource.query(function () {
});
return data;
}
});
控制器调用服务,以获取他们需要的数据:
Controller 1
header.controller("header.selection.product", function ($scope, productDao) {
$scope.products = null;
productDao.getProductModel().$promise.then(function (result) {
$scope.products = result;
});
});
Controller 2,3,4...
它们看起来几乎相同,但它们将数据用于不同的目的。
现在我不知道实现 "datasource" 的正确方法,它可以从所有控制器访问。我不想请求所有的数据,对于每个控制器启动,它应该只请求一次。
如何自动更改所有其他控制器的数据,当产品在一个控制器中更新时,该服务应该进行更新(尚未实现),当更新成功时,他们 "centralized data" 应该更改,以及所有控制器数据。
我读到有关为此目的使用 rootScope 的信息,但有人说,不要只创建 factories/services。
如果您将 $http
与缓存选项一起使用,则只有您的一个控制器会发出 "real" 请求,所有其他控制器将从缓存中获取产品。
$http.get(url, { cache: true })
或者您可以 emit
来自工厂内部的结果,让控制器听取。
getProducts: ->
url = productsApiEndPoint
$http.get(url, { cache: true })
.then(
(data) ->
$rootScope.$emit('YourFactory.getProducts', data);
(error) ->
//handle error
)
我更喜欢第一种方法。更清晰了。
您可以使用 mediator pattern 并协调数据流。创建一个将成为你的中介的服务,当数据到达时从该服务发送到你的控制器。当控制器更改数据时从控制器发送到该服务,然后服务将发送回其余控制器
在您的工厂中将数据发送到中介服务:
product.factory("productResource", function ($resource) {
var resource = $resource("/fooo/rest/products/:id", {}, {
query: {
method: "GET",
isArray: true
}
});
resource.query(...)
.$promise.then(function(products) {
$rootScope.$emit('ProductsFetched', products);
});
});
在你的中介服务上监听并发送给控制器。
product.service("productDao", function (productResource) {
$rootScope.$on('ProductsFetched', function(data){
$rootScope.$emit('ProductsChange', data);
});
$rootScope.$on('ProductsChangeFromControllers', function(data){
$rootScope.$emit('ProductsChange', data);
});
});
在你的控制器上监听并发送给中介服务:
header.controller("header.selection.product", function ($scope, productDao) {
var products = null;
$rootScope.$on('ProductsChange',function(data){
products = data;
});
// do something with the products
$rootScope.$emit('ProductsChangeFromControllers', products);
});
也许有一些语法错误,但我只是想告诉你如何构建它。