2016-12-15 2 views
0

Мне нужно реализовать фид с ng-repeat. Элементы фида должны сортироваться по времени. Однако я не могу использовать один и тот же шаблон для каждого элемента, потому что события и поведение различны. Будет ли использовать ng-if для рендеринга событий фида?различные шаблоны и объекты в ng-repeat

<ul ng-controller="FeedController as FeedCtrl"> 
<li ng-repeat="feedItem in FeedCtrl.feedFactory.feedItems | orderBy '-date_created'"> 
    <div feed-comment-liked ng-if="feedItem.type == 'comment_liked'" item-info ="feedItem"> 
    <div feed-comment-reply ng-if="feedItem.type == 'comment_reply'" item-info ="feedItem"> 
    <div feed-friend-request ng-if="feedItem.type == 'friend-request'" item-info ="feedItem"> 
</li> 
</ul> 

Это, конечно, потребует ряд директив под названием feedCommentLiked, feedCommentReply и feedFriendRequest, каждый со своим шаблоном, и получать их данные через пункт-инфо связывания.

Я думаю, что это нормально, но я надеюсь, что другие пошли по этой дороге. Наиболее очевидным ограничением в том, почему я не включаю несколько списков ng-repeat, является то, что их нужно упорядочить по тому же атрибуту date_created.

ответ

0

Вы можете использовать тонкий директивный подход, чтобы у вас была одна директива.

<ul ng-controller="FeedController as FeedCtrl"> 
<li ng-repeat="feedItem in FeedCtrl.feedFactory.feedItems | orderBy '-date_created'"> 
<div thin-directive="{{myConfig[feedItem.type]}}" item-info ="feedItem"> 
    </li> 
</ul> 

$scope.myConfig = { 
    comment_liked: 'template url here', 
    comment_reply: 'template url here', 
    friend-request: 'template url here', 
} 

----- 

.directive('thinDirective', function($compile,$templateRequest) { 
return { 
    restrict: 'A', 
    scope: false, 
    compile: function(element, attrs) { 
    return function (scope, element, attrs) { 
    $templateRequest(attrs.thinDirective).then(function(html){ 
     var template = angular.element(html); 
     element.append(template); 
     $compile(template)(scope); 
    }); 
    } 
} 

}; 

или вы можете использовать ng-include вместо тонкой директивы, но он будет создавать N подсечек. Ваш звонок

<ul ng-controller="FeedController as FeedCtrl"> 
<li ng-repeat="feedItem in FeedCtrl.feedFactory.feedItems | orderBy '-date_created'"> 
<div ng-include="myConfig[feedItem.type]" item-info ="feedItem"> 
    </li> 
</ul> 
+0

Помимо отсутствия инструкций ng-if в innerHtml элемента ng-repeat, я предполагаю, что вы можете централизовать проблему в одном файле. Но это все. Может быть, хороший подход. – chipmunkrumblestud

+0

Но я не могу поколебать ощущение, что это обходное решение не использует фреймворк должным образом: -/ – chipmunkrumblestud

+0

Это не обходной путь, если быть честным в этом случае, вы не выполняете сравнения 3xN (если утверждения) относительно ng-repeat. Вы просто берете значения с карты и применяете шаблон. Более того, вы также не создаете подкоды, которые вы использовали бы с помощью ng-include. Вы можете использовать ng-include, если хотите, но в этом случае вы создадите N подкопов. Таким образом, нативным решением для углового было бы использование ng-include и map myConfig выше, но это решение (с тонкой директивой) имеет лучшую производительность. Я обновил свой ответ с помощью решения ng-include – Melzar

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