2014-10-06 2 views
4

Используя AngularFire, я расширяю объекты-объекты, чтобы иметь инкапсулированные данные и разрешать определенные функции, как объясняется в official tutorial. У меня есть структура данных, как в следующем:AngularFire ObjectFactory Childobjects вызывает круговую зависимость

{ 
    '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 и, следовательно, должен воссоздать объект комментария с помощью нового комментария (commentId), для которого мне нужно ввести комментарий в статью. То же самое верно для комментария, так что я получаю круговую зависимость статьи -> Комментарий -> Статья. Следующая скрипка показывает поведение: http://jsfiddle.net/michaschwab/v0qzdgtq/.

Что я делаю неправильно? Является ли это плохой концепцией/структурой для углового? Благодаря!!

+0

Здесь нет кода, использующего $ extendFactory, а также полученную вами ошибку или какое-либо объяснение того, что не так с наличием круговой ссылки в этом случае. – Kato

+0

Извините, я вижу, что это сбивает с толку. Я добавил jsfiddle, показывающий, что я пытаюсь сделать, но я все еще пытаюсь заставить его работать на jsfiddle. Надеюсь, это поможет, и спасибо за попытку. Проблема, которую я имею, это просто то, что angularjs не будет работать, только давая мне ошибку «Circular Dependency». Я могу сделать var Comment = $ injector.get ('Comment'); чтобы избежать ошибки, это лучшее решение? –

+0

Это связано с http://stackoverflow.com/questions/19344214/problems-with-circular-dependency-and-oop-in-angularjs, но я не знаю, какое лучшее решение при попытке создать реляционный слой абстракции db. –

ответ

0

Что я делаю неправильно? Является ли это плохой концепцией/структурой для углового? Спасибо!

Вы создаете круговые зависимости.

Я могу сделать var Comment = $ injector.get ('Comment'); чтобы избежать ошибки, - это лучшее решение?

Я вижу два решения: -

1) инъекционного раствора Ленивый (вы предложили себя)

Это лучшее решение, чтобы избежать этих циклических зависимостей в AngularJS. Хотя вы смотрите на документацию AngularFire, вы попадаете в неизведанную территорию, так как некоторые из этих вещей в AngularFire являются экспериментальными по своей природе.

Здесь работает скрипка от вашего

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

Вы существенно ленивые инъекционным ваших ссылки.

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

2) Модуль запуск блок:

С помощью этой опции вы можете иметь возможность вводить эту зависимость в ваши заводы вместо использования $ форсунки.

+0

Спасибо за ваши предложения. Я не понимаю, почему я пытаюсь создать простую реляционную базу данных, и мне приходится вводить «неизведанную территорию» и использовать экспериментальные функции. Что делают пользователи AngularFire, они просто позволяют писать любые свойства данных, которые контроллер хочет написать? 2) Я искал модульные блоки запуска, но еще не понял, как это может мне помочь - любой совет? И почему вы считаете, что ленивые инъекции лучше? Из того, что я видел, блоки запуска модуля не должны запускаться для тестов, но я думаю, что мне нужны депо, чтобы запускать тесты модели. –

+0

Вы по существу пытаетесь создать двунаправленную ассоциативную связь или довольно составную связь в Javascript. IMHO ORM - это боль, которая была решена тяжелыми весами, такими как (n) Hibernate и т. Д. И JPA в Java World. Вы пытаетесь представить эти отношения в Javascript. Угловые обещают DI, поскольку он позволяет вводить объекты, которые являются конструкторами в случае Firebase/вашего примера. Я знаю, что знаю реализацию DI, которая устраняет проблему циклической зависимости. Таким образом, представляя «простые отношения отношения» в мире OO, никакие инструменты не растягиваются. – bhantol

+0

Запуск блока: я думаю, что это не будет сокращаться для вас сейчас, когда я понимаю ваш вопрос, но это похожее решение только для того, чтобы мы удалили эти зависимости на фабриках, а в более поздней точке, то есть в run() вы выполните проводку, то есть установите конструктор функции, чтобы комментарии имели доступ к конструктору статьи, а фабрика статей - с конструктором комментариев. Lazy $ injector лучше, потому что он держит эту технологию ткачества в контексте. Представьте, что целая куча таких отношений заканчивается в блоке запуска, а не интуитивно понятна. – bhantol

Смежные вопросы