【问题标题】:AngularJS Circular Dependency - TransformersAngularJS 循环依赖 - 变形金刚
【发布时间】:2015-09-04 11:36:11
【问题描述】:

如果可能的话,寻求一些建议。

在处理 API 和嵌套资源时,我正在尝试制作一组​​“转换器”,将数据格式化为更可用的格式。

在这样做时,由于嵌套资源的性质,我必须创建一个循环依赖关系,并且关系可能是双向的。

这是一个例子:

客户端转换器

angular.module('services.transformers.clients', [

])
.service('ClientTransformer', function ClientTransformer(DateService, EventTransformer){
    var transformer = this;

    transformer.transform = function(client) {
        clientObject = {
            id: client.id,
            name: client.name
        };

        if(client.events) {
            clientObject.events = includeEvents(client);
        }

        return clientObject;
    }

    transformer.transformCollection = function(clients) {
        for(var key in clients.data) {
            if(clients.data.hasOwnProperty(key)) {
                clients.data[key] = transformer.transform(clients.data[key]);
            }
        }
        return clients.data;
    }

    function includeEvents (client) {
        return EventTransformer.transformCollection(client.events);
    }
})
;

事件转换器

angular.module('services.transformers.events', [

])
.service('EventTransformer', function EventTransformer(DateService, ClientTransformer){
    var transformer = this;

    transformer.transform = function(event) {
        eventObject = {
            id: event.id,
            title: event.title,
            description: event.description,
            client: includeClient(event),
            starts: DateService.createDateFromObject(event.starts),
            ends: DateService.createDateFromObject(event.ends)
        };

        return eventObject;
    }

    transformer.transformCollection = function(events) {
        for(var key in events.data) {
            if(events.data.hasOwnProperty(key)) {
                events.data[key] = transformer.transform(events.data[key]);
            }
        }
        return events.data;
    }

    function includeClient (event) {
        // check if client is an ID or nested data. If nested, transform then return
        return (event.client.data) ? ClientTransformer.transform(event.client.data) : event.client;
    }

})
;

您可以想象,这些资源中的每一个都有更多的关系,但这些服务需要相互依赖。我可能正在访问 Event 资源,并且有嵌套的 Clients,或者 Vice Versa。

Angular 真的不喜欢这样,并引发循环依赖错误,但我不确定如何解决这个问题,或者构建我的应用程序的更好方法。

任何帮助将不胜感激

谢谢!

【问题讨论】:

  • 这是一个 hack,所以我将它作为评论发布,您可以创建角度变量 Transformers 并且创建时的每个转换器都将添加到该变量中。而是注入变压器,您只需注入该变量。这样你就可以摆脱循环依赖。什么是正确的方法?我会说重新设计你的代码

标签: angularjs circular-dependency


【解决方案1】:

你可以在实际使用时注入 $injector 服务并获取依赖。

这是您的解决方法:

.service('EventTransformer', function EventTransformer(DateService, $injector){

    ...

    function includeClient (event) {
        var t = $injector.get('ClientTransformer');
        return (event.client.data) ? t.transform(event.client.data) : event.client;
    }

})

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 2020-09-27
    • 2014-04-28
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多