使用$rootScope在AngularJS中返回json?
我有一个函数,它返回带有使用$rootScope在AngularJS中返回json?,json,angularjs,angularjs-scope,rootscope,Json,Angularjs,Angularjs Scope,Rootscope,我有一个函数,它返回带有$scope.product\u owners=data的json $http({ url: "php/functions.php", method: "GET", params: { action: "get_product_owners" } }).success(function(data) { $scope.product_owners = data; }); 目前,我在我所有的控制器中调用这个函数,
$scope.product\u owners=data的json
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
});
目前,我在我所有的控制器中调用这个函数,因为它在控制器中使用,但我想知道是否可以调用一次。例如,使用$rootScope
或类似的工具。跨控制器共享数据的“角度方式”是使用:
app.factory('ProductOwners', function ($http) {
var service = {
data: []
};
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
service.data = data;
});
return service;
});
然后在每个控制器中注入服务:
app.controller('someCtrl', function (ProductOwners) {
$scope.product_owners = ProductOwners.data;
});
具有“惰性”评估的不同实现(即,它仅在需要时进行调用,然后提供相同的数据):
更新
还有另一个不同的实现,它使用“lazy”求值并支持传递给getData()
的参数:
您完全可以将其放置在$rootScope
上以保存多个调用
问题是-如果在一个控制器上进行一次调用,是否可以转到其他视图/控制器,从而跳过调用
如果答案是否定的,那么你就没有问题了
如果答案是肯定的,那么您应该有一个控制器包装所有其他控制器,以确保您拥有该数据
另一种可能是使用服务保存产品所有者
数据,每个控制器都可以访问该服务器以获取数据,如果数据不可用,则通过ajax
请求获取数据。如果应用程序中多个控制器使用相同的代码,您可能希望将其放入服务中,然后可以从控制器调用它:
myApp.service('products', function($http) {
this.getProductOwners = function(targetScope) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
targetScope.product_owners = data;
});
};
});
myApp.controller('MyCtrl', function($scope, products) {
products.getProductOwners($scope);
});
然后,在控制器中:
myApp.service('products', function($http) {
this.getProductOwners = function(targetScope) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
targetScope.product_owners = data;
});
};
});
myApp.controller('MyCtrl', function($scope, products) {
products.getProductOwners($scope);
});
使用服务是多个控制器之间代码重用的首选方式。1-您可以创建一个工厂,然后在需要时在控制器内部调用它
yourApp.factory('httpFactory', function($http) {
return {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
this.product_owners = data;
});
}}
然后基本上你把它注射到任何地方
yourApp.controller('xCtrl', function (httpFactory) {
$scope.product_owners = httpFactory.product_owners;
});
2-你也可以有一个像这样的应用程序主控制器
<body ng-controller="mainCtrl">
现在,您可以从任何schild示波器访问这些数据我有点困惑。你说的是服务
,但你用的是工厂
。我觉得不一样?你觉得@z.a的第一个解决方案怎么样?你的看起来真的很棒,但很复杂?重新命名服务与工厂:这是Angular最令人困惑的事情之一(特别是对于新手),但是你可以用许多不同的函数(包括provider()、factory()、service()、constant()、value()等)注册一个Angular“服务”。实际上,它们都在内部使用provider()
函数,并且对于更简单的情况(例如您的情况)来说,它们只是语法上的糖。因此,是的,调用app.factory(…)
将使您获得一个角度服务。关于@z.a.的答案与我的答案:z.a.的第一个答案与我的第一个答案相同(因此没有评论)。我的第二个答案确实更复杂,但它提供了一个好处,即只有在需要时(例如,如果有人要求)才从服务器获取数据。如果数据集的大小不是可以忽略的,或者您的目标是移动设备(请求的数量会产生明显的影响),那么这个答案值得付出额外的代价。最后,我不推荐@z.a.的第二个答案,因为它可能会导致一些子作用域属性“阴影”的模糊错误mainCtrl的产品所有者
(属性)。更不用说测试性和可维护性是如何受到负面影响的了。使用服务(提示:可注入+单例)共享数据通常被认为是一种良好的做法。@Steffi:我在上次更新中遇到了一个bug(忘记初始化数据
)。我更正了我的答案(将var数据;
替换为var数据={};
)。它现在应该能正常工作了。
yourApp.controller('mainCtrl', function($scope, $http) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
}); }