首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度分组方向起始点

角度分组方向起始点
EN

Stack Overflow用户
提问于 2015-07-02 18:27:21
回答 1查看 123关注 0票数 0

我正在尝试创建一个具有多个预定义过滤器的分组和过滤机制。我有一组未定义的规则和一些预定义的分组操作,例如"relativeDate“(今天、明天、昨天、本周...)、"boolean”或。这组操作应该是可扩展的。

我已经设法让它在一个控制器中工作。但我希望将其外包到一个指令中,以使其与其他对象集合一起工作。问题是:我需要动态地指定列表的模板。

想象一下下面的集合:

代码语言:javascript
复制
$scope.memosReceived = [
     { id: 1, from: 'Henry Ford', title: 'Want your Model T?', received: '2015-05-04T12:30:00', read: true },
     { id: 2, from: 'Oliver Newton', title: 'Look at this!', received: '2015-06-15T08:00:00', read: true }
     ...
];

$scope.memosSent = [
     { id: 1, to: 'Henry Ford', title: 'That is an old car', sent: '2015-05-04T12:35:21', read: true },
     { id: 2, to: 'Oliver Newton', title: 'Stop Spam', sent: '2015-06-15T08:01:47', read: false }
     ...
];

现在,标记应该如下所示:

代码语言:javascript
复制
<div ng-controller="controller">
    <h2>Received</h2>
    <grouped-list ng-model="memosReceived" item-var="received" grouping-options="groupingReceived">
        <h2>{{ received.title }} <sub>by {{ received.from }}</h2>
    </grouped-list>

    <h2>Sent</h2>
    <grouped-list ng-model="memosSent" item-var="sent" grouping-options="groupingSent">
        <h2>{{ sent.title }} <sub>to {{ sent.to }}</h2>
    </grouped-list>
</div>

选项可能如下所示:

代码语言:javascript
复制
$scope.groupingReceived = [
    { modelKey: 'received', action: 'relativeDate', options: { [.. passed to grouping action, like value->name mapping ..] },
    { modelKey: 'read', action: 'boolean', options: { [...] } }];

$scope.groupingSent = [
    { modelKey: 'sent', action: 'relativeDate', options: { [.. passed to grouping action, like value->name mapping ..] },
    { modelKey: 'read', action: 'boolean', options: { [...] } }];

呈现的超文本标记语言应该看起来像这个"PseudoHtml":

代码语言:javascript
复制
<div ng-controller="controller">
    <h2>Received</h2>
    <div class="grouped-list">
        <div class="filter-section">
            <button ng-click="openFilters = !openFilters>Open Filters</button>
            <div class="filter-options" ng-hide="!openFilters">
                <h4>Group by</h4>
                [selectbox given group actions] [selectbox sort ascending or descending]
                <h4>Filter by</h4>
                [build filters by similar to group actions given filter actions]
            </div>
        </div>
        <div class="group">
            <div class="group-header">
                <h3>Yesterday</h3>
            </div>
            <ul class="group-list">
                <li ng-repeat="received in ngModel | customFilters">
                    <!-- something like transclusion starts here -->
                    <h2>{{ received.title }} <sub>by {{ received.from }}</h2>
                    <!-- something like transclusion ends here -->            
                </li>
           </ul>
        </div>
        <div class="group">
            <div class="group-header">
                <h3>Last Week</h3>
            </div>
            <ul class="group-list">
                <li ng-repeat="received in ngModel | customFilters">
                    <!-- something like transclusion starts here -->
                    <h2>{{ received.title }} <sub>by {{ received.from }}</h2>
                    <!-- something like transclusion ends here -->            
                </li>
            </ul>
        </div>
    </div>

    <h2>Sent</h2>
    <div class="grouped-list">
        [... same like above ...]
    </div>
</div>

我真的很纠结如何实现这个行为,在哪里存储逻辑的几个部分(例如,分组操作,自定义过滤器),以及如何正确地转换它。

也许有人能给我一个很好的起点。

EN

回答 1

Stack Overflow用户

发布于 2015-07-02 19:39:16

您可以创建自定义筛选器,并从指令的控制器调用它。

在此筛选器中,您可以通过将参数传递给筛选器来决定应触发哪个筛选器操作。

我会从控制器而不是模板调用它,因为在那里你可以更容易地链接你的过滤器。

请看下面的演示或此jsfiddle中的演示。

在将我的代码添加到SO的过程中,我在使用较新的AngularJS版本的代码中检测到了一个错误(不显示项目)。不确定它是什么,但在1.2.1版本中它是有效的。我待会再检查这个。看起来像是范围问题。

代码语言:javascript
复制
angular.module('demoApp', [])
    .filter('aw-group', function($filter) {
        var filterMethods = {
            relativeDate: function(input, action) {
                console.log('relative date called', input);
                return input; // do the translation to relative date here
            },
            filterByNumber: function(input, action, options) {
                // if you need mor parameters
                return $filter('filter')(input, options.number);
            },
           otherFilter: {
           }
        };
        
        return function(input, action, options) {
            return filterMethods[action](input, action, options);
        };
    })   
    .directive('groupedList', function () {
    return {
        restrict: 'E',
        scope: {
            model: '=',
            itemVar: '=',
            filter: '='
        },
        transclude: true,
        template: '<ul><li ng-repeat="item in filteredModel" ng-transclude>'+
        '</li></ul>',
        controller: function($scope, $filter) {
            //console.log($scope.filter);
            
            $scope.filteredModel = $filter('aw-group')($scope.model, 'filterByNumber', { number: 2 }); // passing action from $scope.filter.action as second parameter, third is an options object
        }
    };
})
    .controller('mainController', function () {
    this.data = [{
        title: 'Test1',
        from: 'tester1'
    }, {
        title: 'Test2',
        from: 'tester1'
    }, {
        title: 'Test3',
        from: 'tester1'
    }, ];
    this.groupingReceived = [{
        modelKey: 'received',
        action: 'relativeDate',
        options: {},
        modelKey: 'read',
        action: 'boolean',
        options: {}
    }];

    this.memosReceived = [{
        id: 1,
        from: 'Henry Ford',
        title: 'Want your Model T?',
        received: '2015-05-04T12:30:00',
        read: true
    }, {
        id: 2,
        from: 'Oliver Newton',
        title: 'Look at this!',
        received: '2015-06-15T08:00:00',
        read: true
    }];

});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.1/angular.min.js"></script>
<div ng-app="demoApp" ng-controller="mainController as ctrl">
    <grouped-list model="ctrl.data" item-var="received" filter="ctrl.groupingReceived">
         <h2>{{item.title}}<sub>{{item.from}}</sub></h2>

    </grouped-list>
</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31182060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档