4

使用 AngularFire,我正在扩展对象工厂,以便封装数据并允许特定功能,如官方教程中所述。我有一个如下的数据结构:

{
    'articles': {
        'article-asd876a': {
            title: 'abc',
            text: 'lorem ipsum ...',
            comments: {
                'comment-ad4e6a': true,
                'comment-dsd9a7': true
            }
        }
    },
    'comments': {
        'comment-ad4e6a': {
            text: 'comment text1',
            articleId: 'article-asd876a'
        },
        'comment-dsd9a7': {
            text: 'comment text2',
            articleId: 'article-asd876a'
        }
    }
}

现在我希望能够做到这一点:

var article = new Article(8); // Returns the object created by my object factory, fetching data from firebase
var comments = article.getComments(); // Returns an array of type Comment
var firstText = comments[0].getText();
var article2 = comments[0].getArticle(); // article2 === article

但这对我来说在很多层面上都失败了。其中之一是:在文章中,我只能存储评论 ID,因此必须使用 new Comment(commentId) 重新创建评论对象,为此我需要将评论注入文章。评论也是如此,所以我最终得到了一个循环依赖文章 -> 评论 -> 文章。以下小提琴显示了该行为:http: //jsfiddle.net/michaschwab/v0qzdgtq/

我究竟做错了什么?这对角度来说是一个糟糕的概念/结构吗?谢谢!!

4

1 回答 1

0

我究竟做错了什么?这对角度来说是一个糟糕的概念/结构吗?谢谢!!

您正在创建循环依赖项。

我可以做 var Comment = $injector.get('Comment'); 为了避免错误,这是最好的解决方案吗?

我看到两个解决方案: -

1)懒惰注射液(你自己建议的)

这是避免 AngularJS 中那些循环依赖的最佳解决方案。尽管查看 AngularFire 文档,但您进入了一个未知领域,因为 AngularFire 中的一些内容本质上是实验性的。

这是您的工作小提琴

var Comment = $injector.get('Comment');

您本质上是懒惰地注入您的参考资料。

http://jsfiddle.net/yogeshgadge/ymxkt6up/5/

2)模块运行块:

使用此选项,您可以将这些依赖项注入您的工厂,而不是使用 $injector。

于 2014-10-15T16:17:39.363 回答