Angular 1.5.0 - 为什么工厂只调用一次?

时间:2016-02-26 11:48:39

标签: javascript angularjs

我有一个html模板,用于显示Angular工厂的数据。问题是工厂的get方法仅在第一次加载页面时才执行对后端的调用。当重复打开页面时,我只看到第一次调用后端的结果。 看起来工厂以某种方式缓存结果。 使用Chrome调试工具,我发现Angular会在每次加载页面时使用相同的资源ID发出GET个请求。

这是工厂定义:

.factory('Company', ['$resource', '$routeParams', function ($resource, $routeParams) {
    return $resource('/companies/getCompany/:companyId', {}, {
        get: {
            method: 'GET',
            url: '/companies/getCompany/:companyId',
            params: {
                'companyId': $routeParams.companyId
            }
        },
        save: {
            method: 'POST',
            url: '/companies/updateCompany'
        },
        insert: {
            method: 'POST',
            url: '/companies/createNewCompany'
        }
    });
}])

这是控制器代码

.controller('MyController', ['$scope', '$location', 'Company',
    function ($scope, $location, Company) {
        Company.get(function (data) {
            $scope.company = data;
        });
    }]);

我正在使用ng-click打开页面

<tr ng-repeat="company in companies"
    ng-click="redirectToCompanyForm(company.id)">


$scope.redirectToCompanyForm = function (companyId) {
   $location.url('/updateCompany/' + companyId);
}

我在工厂设置断点 - 应用程序仅在我第一次访问页面时暂停。

为什么我的工厂只调用一次,我该如何解决?

3 个答案:

答案 0 :(得分:0)

来自Angular docs

  

注意:Angular中的所有服务都是单例。这意味着进样器最多使用一次配方来创建对象。然后,注射器会缓存该参考,以满足未来的所有需求。

所以你是对的,所有服务只创建一次然后由Angular缓存。

编辑:更好地回答下面的情况:

$ resource caching

您可以通过向$resource调用添加选项来禁用资源缓存:

return $resource('/companies/getCompany/:companyId', {}, {
    get: {
        method: 'GET',
        params: {
            'companyId': $routeParams.companyId
        },
        cache: false // THIS LINE
    }
}

编辑2:根据文档,$resource的第一个参数不是可选的,必须是网址。

答案 1 :(得分:0)

也许您可以在控制器中使用低级$ http方法。

$ resource是一个很棒的实用程序,但在您的情况下,您不希望持久保存数据。

尝试使用$ http.get方法..

或尝试使用 query()方法。

$scope.myData = DataFactory.query();

答案 2 :(得分:0)

最后解决了这个问题。工厂使用不正确。这是工厂模块

.factory('Company', ['$resource', function ($resource) {
    return $resource('/companies/getCompany/:id', null, {
        save: {
            method: 'POST',
            url: '/companies/updateCompany'
        },
        insert: {
            method: 'POST',
            url: '/companies/createNewCompany'
        }
    });
}])

这就是应该如何调用工厂

Company.get({id: $routeParams.companyId}, function (data) {
    $scope.company = data;
});

现在每次加载页面时都会显示正确的数据。