【问题标题】:AngularJS nested ui-view into an ng-repeatAngularJS 将 ui-view 嵌套到 ng-repeat
【发布时间】:2018-07-19 18:48:49
【问题描述】:

我正在使用 Spotify API 创建应用。 这个应用程序可以: 1.通过输入字段按艺术家姓名查找专辑 2. 专辑显示后,用户可以点击专辑标题查看曲目

我创建了 2 个视图: 1.相册视图 2. 曲目视图,专辑视图的子视图。

我想在专辑的 ng-repeat 中显示特定点击专辑的曲目 ui-view - 及其 ID,但结果是我在所有专辑中都有相同的点击专辑曲目列表列表。如何将专辑的曲目 ui-view 显示到单击的专辑容器中,这是 ng-repeat 指令的结果?

这是代码。

路由:

------
.config(function ($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/');

    $stateProvider
      .state('albums', {
        url: '/',
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      }).
      state('albums.tracks', {
        url: ':id/tracks',
        templateUrl: 'views/tracks.html',
        controller: 'TracksCtrl'
      });
})
-----

相册视图:

<div ng-if="albums.items">
    <h1>{{searchedArtist}}'s Album List:</h1>
    <!-- albums ng-repeat -->
    <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
    <img  ng-src="{{album.images[1].url}}" width="100">
    <!-- the action to translate the state to tracks view -->
    <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
    <!-- tracks view -->
    <div ui-view></div>
</div>

主专辑控制器:

angular.module('spotifyAngularApp')
.controller('MainCtrl', function ($scope, spotifyService) {

  var options = {
    'limit': 10
  };

  $scope.searchAlbums= function () {
    var sanitizeArtist = $scope.artist.split(' ').join('+');
    $scope.searchedArtist = $scope.artist;

    spotifyService.search(sanitizeArtist, 'album', options).then(function(data) {
        $scope.albums = data.albums;
    });
  };
});

轨道控制器:

angular.module('spotifyAngularApp')
.controller('TracksCtrl', function ($scope, $stateParams, spotifyService) {
    console.log($stateParams);
    spotifyService.albumTracks($stateParams.id).then(function(data){
        $scope.tracks = data.items;
      });
});

【问题讨论】:

  • 也许这对您来说很有趣:stackoverflow.com/a/24902144/1679310。有一个示例如何处理重复的场景...也许可以提供一些想法...
  • 感谢您的参考,它可以工作,但是当您实例化新状态时,ui-router 会查找模板 url 和 ui-view。但我试图弄清楚如何在 ng-repeat 中添加一个 ui-view,其中包含另一个 ng-repeat。
  • 你能创建 plunkr 吗,你在哪里找到了样本数据,它会更有帮助
  • 如果原因只是为了将曲目视图的逻辑与专辑控制器分开。只需使用 ng-include 和 ng-controller 来跟踪视图的模板和控制器。此外,如果您想在页面加载时显示特定专辑的曲目(例如,根据 url 参数),您可以在专辑控制器中处理此显示/隐藏逻辑。

标签: javascript angularjs nested angularjs-ng-repeat angular-ui-router


【解决方案1】:

您尝试做的事情没有意义。一个状态可能有多个与之关联的视图,但这些视图必须是预定义的,而不是动态生成的

静态定义只有 1 个视图的代码之间存在冲突:

state('albums.tracks', {
        url: ':id/tracks',
        templateUrl: 'views/tracks.html',
        controller: 'TracksCtrl'
      });

以及您使用ng-repeat动态生成 ui-view 的代码。没有逻辑可以说明将 html 加载到哪个 ui-view 中。在这种情况下,我建议将ui-view 移出ng-repeat,只保留1 个:

<div ng-if="albums.items">
    <h1>{{searchedArtist}}'s Album List:</h1>
    <!-- albums ng-repeat -->
    <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
        <img  ng-src="{{album.images[1].url}}" width="100">
        <!-- the action to translate the state to tracks view -->
        <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
    </div
    <!-- tracks view -->
    <div ui-view></div>
</div>

或者如果你真的需要把它放在ng-repeat 中,因为你的页面布局方式,尝试ng-if 以确保只显示1 个ui-view(this is a workaround and not recommended)

<div ng-if="albums.items">
        <h1>{{searchedArtist}}'s Album List:</h1>
        <!-- albums ng-repeat -->
        <div ng-repeat="album in albums.items | unique:'name'" id="{{album.id}}">
            <img  ng-src="{{album.images[1].url}}" width="100">
            <!-- the action to translate the state to tracks view -->
            <a ui-sref="albums.tracks({id : album.id})">{{album.name}}</a>
            <!-- tracks view -->
            <div ng-if="$state.is('albums.tracks',{id : album.id})" ui-view></div>
        </div>
</div>

并修改您的MainCtrl 以注入$state 以便我们可以在视图中访问它:

angular.module('spotifyAngularApp')
.controller('MainCtrl', function ($scope, spotifyService, $state) {
  $scope.$state = $state;

  //your code
});

【讨论】:

    【解决方案2】:

    不幸的是,您尝试做的事情并没有真正的意义。你的意思是“重复这个状态的(专辑)查看次数等于收藏专辑中有多少项目。”但是,当您单击锚点时,您是在告诉 album.tracks state 去获取带有您单击的专辑 ID 的专辑。然后,这将在专辑视图的每个 ui 视图中显示 album.tracks 状态(这就是您所看到的)。

    不能像您在此处尝试那样在同一页面上多次“实例化”单个状态。有关更多信息,请参阅此问题:Does Angular JS support routing of multiple views on the same page

    我建议以不同的方式构建它 - 如果您需要将模板分开,可能使用带有 ngInclude 的 ng-repeat。否则,在一个页面上构建整个模板可能更容易,对所有专辑和曲目进行 ng-repeat,然后隐藏所有这些并在通过 ngHide/ngShow 单击时显示每一个。

    【讨论】:

    • ngInclude 指令绝对是通往这里的路线,并将潜在的“视图”封装为控制器中的集合,然后可以根据需要提供内容。
    【解决方案3】:

    如果您需要在 ng-repeat 中创建多个视图,创建指令会更好吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2014-03-13
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多