【问题标题】:AngularJS ui-router view structure product siteAngularJS ui-router 视图结构产品站点
【发布时间】:2015-01-21 16:19:52
【问题描述】:

所以我正在创建一个产品网站.. 有点像网上商店。

该网站将有一个带有顶部菜单的标题、一个带有过滤器的侧边栏、一个内容区域和一个页脚。 我希望侧边栏过滤器根据选择的顶部菜单进行更新。

因此,当我在顶部菜单中选择新项目时,左侧的过滤器应该会更新,并且在选中/取消选中过滤器时会过滤产品。

这个应用程序的良好结构是什么?

  • 我是否应该有一个“主视图”来加载页眉、侧边栏、主要内容和页脚?
  • 或者我应该在 index.html 中将它们分成一个视图?
  • 还是应该将它们分成 3 个视图?页眉、内容、页脚?

我看到的主要问题是应该显示的产品取决于侧边栏过滤器,然后侧边栏过滤器取决于所选的顶部菜单..

欢迎提出想法 :)

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    我想与您分享我的方法。有一个working plunker

    让我们有三个区域布局 - 顶部、左侧、主要。这些可能是状态:

    $stateProvider 
        .state('index', {
            url: '/',
            views: {
              '@' : {
                templateUrl: 'layout.html',
                controller: 'IndexCtrl'
              },
              'top@index' : { templateUrl: 'top.html',},
              'left@index' : { templateUrl: 'left.html',},
              'main@index' : { templateUrl: 'main.html',},
            },
          })
        .state('index.list', {
            url: '^/:category',
            templateUrl: 'list.html',
            controller: 'ListCtrl'
          })
        .state('index.list.detail', {
            url: '/:id',
            views: {
              'detail@index' : {
                templateUrl: 'detail.html',
                controller: 'DetailCtrl'
              },
            },
          })
    

    索引将创建一个范围,该范围将被继承到每个子状态和大子状态。所以我们可以使用$scope.Model 来保持数据的整合。

    这些将是控制器:

    .controller('IndexCtrl', ['$scope', function($scope){
      $scope.Model = {
        categories : ["Music", "Video"],
      }
    }]) 
    .controller('ListCtrl',  ['$scope', '$stateParams', function($scope, $stateParams){
      // add items to the model
      $scope.Model.items = $stateParams.category === "Music"
        ? ["Depeche Mode", "Nick Cave"]
        : ["Star Wars", "Psycho"]
      $scope.$on("$destroy", function() {delete $scope.Model.items; })
    }])
    .controller('DetailCtrl', ['$scope', '$stateParams', function($scope, $stateParams){
      // add item to model
      $scope.Model = { 
        item : $scope.Model.items[$stateParams.id],
      }
      $scope.$on("$destroy", function() {delete $scope.Model.item; })
    }])
    

    这里发生了什么?部分我们使用 $stateParams 来改变状态(category 被传递给 List ... id 进入细节)

    所有状态(一直向下)都可以访问$scope.Model 的同一实例(参考)

    全部查看here

    另外,这里发生的是 $scope 继承的真正用途,在 UI-Router 中是由视图嵌套驱动的。请检查this detailed description

    【讨论】:

    • 啊好吧..谢谢!一个问题..您使用多个视图而不是嵌套它们的原因是什么?
    • 好问题。而答案,我想说的是——由你决定。多个视图可以做一些聪明的工作,在你选择细节之前......即使在“索引”状态下,你也可以为 user 提供一些默认(“营销”;)的东西。可能有一些内容......稍后被孩子取代。但这取决于你。我试图把我的方式放在一起......简化。但这个概念是这样的......希望它有点帮助;)
    • 那么使用嵌套视图和使用服务在它们之间传递数据与使用多个视图相比没有任何好处吗?
    • 通过服务传递数据不是我的方式。服务是单例的,在应用程序的整个生命周期中都存在。正如我向您展示的那样,我的方法是使用$scope.Model = {}。这样的参考一直存在到父母活着。因此,如果我转到其他根状态,那就没有了。但是又一次..这取决于你。嵌套状态支持拆分索引/列表/详细信息......多视图允许解决分离的东西......部分可覆盖。希望它确实有意义......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多