0

我有一个 SPA,其中显示在登录页面上的客户列表。每个客户端都有一个编辑按钮,如果单击该按钮,我会转到该选定客户端的编辑视图。

我不知道该怎么做——到目前为止我看到的所有路由都只会在 $routeParams 中获取我的客户端 ID,然后大多数示例将通过该 ID 从工厂中拉出客户端。

但是我已经有了我的客户......当我已经拥有它时再次访问我的 web api 站点似乎是一种浪费。是否可以路由到新视图并在 $scope 中维护选定的客户端?编辑:这就是我所做的-我不知道它是否比克拉克的响应更好或更差......我刚刚做了以下角度服务:

app.service('clientService', function () {
    var client = null;

    this.getClient = function () {
        return client;
    };

    this.setClient = function (selectedClient) {
        client = selectedClient;
    };
});

然后对于需要该数据的任何控制器:

$scope.client = clientService.getClient();

这似乎工作正常......但很想听听这是好是坏。

4

1 回答 1

1

取决于您想要的缓存级别。

您可以依赖浏览器缓存,在这种情况下,适当的 HTTP 标头就足够了。

您可以依赖 $http 以角度提供的缓存,在这种情况下,确保您发送的参数相同就足够了。

您还可以按照以下方式创建自己的模型缓存:

module.factory('ClientModel', function($http, $cacheFactory, $q){
    var cache = $cacheFactory('ClientModel');
    return {
        get : function(id){
            var data = cache.get(id);
            if(data){
                //Using $q.when to keep the method asynchronous even if data is coming from cache
                return $q.when(data);
            } else {
                //Your service logic here:
                var promise = $http.get('/foo/bar', params).then(function(response){
                    //Your model logic here
                    var data = response;
                    cache.put(id, data);
                    return response;
                }, function(response){
                    cache.remove(id);
                    return response;
                });
                //Store the promise so multiple concurrent calls will only make 1 http request
                cache.put(id, promise);
                return promise;
            }
        },
        clear : function(id){
            if(angular.isDefined(id)){
                cache.remove(id);
            } else {
                cache.removeAll();
            }
        }
    }
});

module.controller('ControllerA', function(ClientModel){
    ClientModel.get(1).then(function(){
        //Do what you want here
    });
});

module.controller('ControllerB', function(ClientModel){
    ClientModel.get(1).then(function(){
        //Do what you want here
    });
});

这意味着每次您请求具有相同“id”的客户端对象时,您都会得到相同的对象。

于 2013-07-10T00:59:04.950 回答