Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用$rootScope在AngularJS中返回json?_Json_Angularjs_Angularjs Scope_Rootscope - Fatal编程技术网

使用$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;
}); }