Angularjs 未在作用域上定义资源文件

Angularjs 未在作用域上定义资源文件,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我有一个资源文件,有时是读取的,有时是未定义的,并崩溃了所有的应用程序。我不知道为什么它只在某些时候起作用,这给我找到解决办法带来了麻烦。在我的控制器上,我正在传递我创建的用于读取文件的服务,该文件是AppResourceService: app.controller('CommonController', ['$scope', '$location', 'appResourcesService', function ($scope, $location, appResourcesSe

我有一个资源文件,有时是读取的,有时是未定义的,并崩溃了所有的应用程序。我不知道为什么它只在某些时候起作用,这给我找到解决办法带来了麻烦。在我的控制器上,我正在传递我创建的用于读取文件的服务,该文件是
AppResourceService

app.controller('CommonController', ['$scope', '$location', 'appResourcesService',
    function ($scope,  $location, appResourcesService)
阅读决议的服务如下:

'use strict';
app.factory('appResourcesService', ['$resource', function ($resource) {
    var appResourcesServiceFactory = {};

    appResourcesServiceFactory.getResources = function ($scope, language, locale) {

        var languageFilePath = 'resources/AppResources.json';

        $resource(languageFilePath).get().$promise.then(function (data) {
            $scope.appResources = data;
        }, function (reason) {
            var defaultLanguageFilePath = 'resources/AppResources.json';
            $resource(defaultLanguageFilePath).get(function (data) {
                $scope.appResources = data;
            });
        });
    };
    return appResourcesServiceFactory;
}]);

正如我所说,有时它工作时没有任何问题,但有时当我在控制器中到达piec eof代码
$scope.appResources时,appResources是未定义的。我想这可能是因为它在读取文件之前到达了那里,但我无法找到一个解决方案来避免它

你的工厂应该回复一个承诺。 处理数据是控制器的工作。(我使用$http,因为它更干净)

您可以在控制器内使用解析承诺。然后获取数据并设置范围

appResourcesServiceFactory.getResources().then(function(data) {
   $scope.appResources = data;
})

在没有回答您的问题的情况下,我发现您的应用程序中存在严重的设计问题。服务不应该知道您的范围。管理范围不是他的责任。范围由控制器和视图知道。服务应该由控制器调用并返回数据,或者,如果是异步的,则返回承诺。这是从服务获取数据、处理数据并将其注入范围的控制器。您的问题肯定与这种糟糕的设计有关。因为您的服务没有返回承诺,我想您可能在解决
$resource(languageFilePath).get()
之前尝试访问
$scope.appResources
。@Techniv我同意,它的设计显然很糟糕,这就是问题所在。所以你说我的服务应该返回一个承诺,我应该调用控制器中的一个函数,该函数作为返回?是的。我对@gyc的答案投了赞成票。这是一个很好的例子。我得到了这个错误:提供程序'AppResourceService'必须从$get factory方法返回一个值。很抱歉,我删除了return AppResourceService factory;现在没事了。请将其添加到您的答案中:)
appResourcesServiceFactory.getResources().then(function(data) {
   $scope.appResources = data;
})