【问题标题】:different templates and objects in ng-repeatng-repeat 中的不同模板和对象
【发布时间】:2016-12-15 10:14:02
【问题描述】:

我需要使用 ng-repeat 实现提要。提要项目必须按新近度排序。但是,我不可能为每个项目使用相同的模板,因为事件和行为是不同的。使用 ng-if 来呈现这样的提要事件有意义吗?

<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 的指令,每个指令都有自己的模板,并通过 item-info 绑定获取它们的数据。

我认为这没问题,但我希望其他人也能走这条路。为什么我不包含多个 ng-repeat 列表的最明显限制是它们需要按相同的“date_created”属性排序。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您可以使用精简指令方法,这样您就可以拥有一个指令。

    <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 代替 Thin 指令,但它会创建 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>
    

    【讨论】:

    • 除了在 ng-repeated 元素的 innerHtml 中缺少 ng-if 语句之外,我想我看到您可以将问题集中在一个文件中。但仅此而已。可能是个好方法。
    • 但我无法摆脱这种解决方法没有正确利用框架的感觉:-/
    • 老实说,在这种情况下,您没有对 ng-repeat 执行 3xN 比较(if 语句),这不是一种解决方法。您只是从地图中获取值并应用模板。此外,您也没有创建使用 ng-include 的子范围。如果您愿意,可以使用 ng-include - 但在这种情况下,您将创建 N 个子作用域。因此,Angular 的原生解决方案将是使用 ng-include 并在上面映射 myConfig - 但是这个解决方案(带有瘦指令)具有更好的性能。我已经用 ng-include 解决方案更新了我的答案
    • 您不会为每个提要项呈现每种模板类型,而不管它是否适用?如果我没记错的话,ng-if 可以是一次性绑定。
    • 没问题,如果它不适用,那么您将返回 nil 值,因此不会呈现任何内容(例如,如果您喜欢默认模板,则可以将此解决方案扩展为默认模板,或者将其包装在一个函数中,如果您喜欢 )。如果我的答案是正确的,我们可以将其标记为已接受吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2014-05-23
    • 2019-02-03
    相关资源
    最近更新 更多