【问题标题】:Multiple URLs in one Angular Ui Router state一个 Angular Ui 路由器状态下的多个 URL
【发布时间】:2016-12-27 19:33:17
【问题描述】:

我的应用程序中有一个app.home 状态,其中列出了不同范围的专家。此外,我还有一个范围列表,我们可以通过这些范围来过滤我们的专家(例如医学法律心理学等)。当我按范围过滤专家时,我需要更改浏览器中的 URL,因为用户可以访问此 URL 并获取已经按他们可能需要的范围过滤的专家。我正在使用 ES6 语法和 Webpack 进行编译。所以,这是我的路由器:

home.config.js

function homeConfig ($stateProvider) {
    "ngInject";
    $stateProvider.state('app.home', {
        url: '/',
        controller: 'HomeCtrl',
        template: require('./home.html'),
        resolve: {
            users: function (User) {
               // Call a method from our UserService
               return User.userList().then((users) => users);
            }
        }
    });
}
export default homeConfig

这是我的 home.controller.js

class HomeCtrl {
    constructor(users, Categories) {
        "ngInject";
        this.filters = {};
        this.users = users;
        // Import categories from Categories Service
        this.categories = Categories.categories;
    }
}
export default HomeCtrl;

这是我的 index.js,这些模块在其中捆绑并随后包含在主应用程序模块中:

import angular from 'angular'; 
import homeConfig from './home.config';
import HomeCtrl from './home.controller';

let homeModule = angular.module('app.home', []);
homeModule.config(homeConfig);
homeModule.controller('HomeCtrl', HomeCtrl);

export default homeModule;

最后这是我的模板:

<ul>
    <li>
       <a href="#" ng-click="$ctrl.filters.scope = ''">Show all</a
    </li>
    <li ng-repeat="category in $ctrl.categories">
       <a ng-click="$ctrl.filters.scope = category">{{category}}</a>
    </li> 
</ul>
<!-- Specialists displayed -->
<div ng-repeat="user in $ctrl.users | filter: $ctrl.filters">
    <img ng-src="{{user.image}}"/>
    <p>{{user.userName}}</p>
</div>

当我过滤我的专家时,有什么方法可以更改网址吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您可以简单地将过滤器添加到$location 并在控制器内的激活函数中使用它。

    // get current filter in activate function (e.g. www.example.com/?scope=law)
    var filter = $location.search();
    // => {scope: 'law'}
    
    // set scope to 'law', when user applies new filter
    $location.search('scope', 'law');
    

    另一种解决方案是使用$stateParams 解析您的状态。

    .state('app.home', {
        url: '/:scope',
        template: require('./home.html'),
        controller: 'HomeCtrl',
        resolve: {
             users: ['$http','$stateParams', function($http, $stateParams) {
                 //get users based on $stateParams 
             }]
         }
    })
    

    如果您只想在前端进行过滤,您可以获取所有用户并解析过滤器。然后在您的控制器中设置您最初解析的过滤器。

    .state('app.home', {
        url: '/:scope',
        template: require('./home.html'),
        controller: 'HomeCtrl',
        resolve: {
             users: function (User) {
               // Call a method from our UserService
               return User.userList().then((users) => users);
             },
             filters: ['$http','$stateParams', function($http, $stateParams) {
                 //get filters based on $stateParams 
             }]
         }
    })
    
    class HomeCtrl {
        constructor(users, Categories, filters) {
            "ngInject";
            this.filters = filters;
            this.users = users;
            // Import categories from Categories Service
            this.categories = Categories.categories;
        }
    }
    export default HomeCtrl;
    

    【讨论】:

    • 谢谢!但不幸的是,这并没有按预期工作。虽然它确实更改了 url,但当我复制该 url 并在新的浏览器选项卡中打开它时,它仍然会返回所有专家。我应该改变我的服务方法吗?
    • 您的服务,必须从 url 中获取过滤器并在请求中使用它。这就是为什么我展示如何添加和如何提取它。我添加了另一个解决方案。如果数据集不太重,您还可以在前端请求所有用户和过滤器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-12-24
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多