2015-02-11 3 views
1

Я пытаюсь выяснить, «правильный» способ структурировать часть моего приложения Emberструктурирования ember.js код

Основной обзор:

Скажем, у меня есть Course модели определяется аналогично:

var Course = DS.Model.extend({ 
    videos: hasMany('video', { async: true }), 
    categories: hasMany('category', { async: true }) 
}); 

video Каждый имеет category, связанный с ним.

В моем CourseView или CourseController, как я должен получить список видеороликов для каждой категории?

Во-первых, я попытался использовать вычисленное свойство, но любой звонок, такой как this.get('model').get('videos'), возвращает Promise - не то, что я хочу.

Далее я увидел несколько сообщений об использовании этого и затем установил свойства на контроллере после того, как решает проблему Promise, поэтому View будет обновляться, когда свойства будут изменены, но это связано с большим количеством обратных вызовов, и я надеюсь есть лучший способ подойти к проблеме.

Можно ли каким-либо образом «загрузить» видео/категории перед визуализацией представления? В идеале я мог бы что-то сделать:

{{#each category in categories}} 

    // render category-related stuff and only videos in this category 

{{/each}} 

Было бы лучше иметь все видеоролики в категории? Можно ли каким-либо образом определить/добавить свойства модели без их отправки на сервер? Я думаю, это можно рассматривать как общий вопрос об дизайне API, а также - должны ли видео быть под категориями? По существу, будет список курсов, каждый со своим набором категорий. Каждое видео должно подпадать под одну категорию. После ввода его таким образом, что имеет смысл для видео, чтобы быть по категориям, если все они должны быть под какой-то категории ...

Edit: Вот реализация я просто пошел с ради времени:

Моя Category модель выглядит примерно так:

var Category = DS.Model.extend({ 
    name: attr('string'), 
    description: attr('string'), 
    videos: hasMany('video', { async: true }) 
}); 

В Course шаблона:

... 

{{#each category in model.categories}} 

    {{render "course/category" category}} 

{{/each}} 

... 

В course/category шаблон:

<h2 class="sub-title">{{model.name}}</h2> 

{{render "course/video-gallery" model.videos}} 

где course/video-gallery является то, что я построил для коллекции видео.

Это прекрасно работает, но теперь есть куча видеомоделей во всем мире; на курсе (все они) и на каждой категории (все из них относятся к этой категории).

+1

Может ли видео быть в нескольких категориях? –

+0

Есть вероятность того, что видео имеет более одной категории? – Hrishi

+0

Вы также можете посмотреть видеоролики с боковой загрузкой - ссылки на видео, которые я предполагаю. – Hrishi

ответ

2

Я не знаю вашего конкретного прецедента, но если бы я разрабатывал нечто подобное, у меня был бы класс video с отношением hasMany('categories'), выражающим реальное представление о том, что видео можно «помечать» несколькими категориями , то модели будет выглядеть примерно так:

var Course = DS.Model.extend({ 
    videos: hasMany('video', { async: true }), 
    categories: hasMany('category', { async: true }) 
}); 

var Video = DS.Model.extend({ 
    categories: hasMany('category'), 
    //rest of the attributes 
}); 

var Category = DS.Model.extend({ 
    name: DS.attr(), 
    description: DS.attr(), 
    //other attributes 
}); 

сейчас, вам нужен список видео для каждой категории, чтобы разбить его на более простую задачу, давайте представим, вы можете получить все видео для одной категории. Это достаточно просто, все, что нам нужно сделать, это получить список видео и выбрать те, у которых есть идентификатор этой категории в своем списке categories. Таким образом, полученный код в уголька, если они сделаны вычисляемый свойство на контроллере будет выглядеть следующим образом:

videosByCategory: function() { 
    var cats = this.get('categories'), //grab courses' categories. 
     videos = this.get('videos'); //grab the courses' videos 
    return videos.filter(function(video) { 
    var videoCategories = video.get('categories'); 
    return Ember.EnumerableUtils.intersection(videoCategories,cats).length > 0; 
    }); 
}.property('videos'), 

сейчас, в шаблоне, если доступ к этой вычисленной свойство как это:

{{#each video in videosByCategory}} 
    //whatever goes here 
{{/each}} 

Надежда это помогает. При загрузке курса я бы обошел видео с курсом.

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