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

Angular 1.5.0 - Why is factory called only once?

本文关键字:调用 一次 工厂 为什么 Angular      更新时间:2023-09-26

我有一个显示来自 Angular 工厂的数据的html模板。问题是工厂的 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);
}

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

为什么我的工厂只叫一次,我该如何解决这个问题?

来自 Angular 文档:

注意:Angular 中的所有服务都是单例。这意味着注入器最多使用每个配方一次来创建对象。然后,注入器缓存引用以满足所有未来需求。

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

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

$resource缓存

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

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

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

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

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

试试 $http.get 方法。

或者尝试 query() 方法。

$scope.myData = DataFactory.query();

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

.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;
});

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