角度路由/路径更改和范围问题

时间:2015-03-07 08:52:48

标签: angularjs angularjs-routing

我是AngularJS的新手,我正面临这些问题:

  1. 我想要一个项目列表(电影),当我点击图片或标题时,我希望路径像#/ movie / id。为此,我尝试使用ngRoute并尝试了路径,但我在两者中都遇到了错误,你能指导我哪一个适合我的情况,我该如何使用它?

  2. 正如您在HTML代码中看到的那样,我正在尝试绘制一个搜索框,但是现在当API运行并返回数据时,ng-app的整个内容正在被电影列表替换,我为我想要改变的内容创建了一个新的范围,如果是这样的话,如何以及在哪里?

  3. 这是我的代码:

    
    
    var movies = angular.module("movies", []);
    
    movies.controller('movieController', function ($scope, $http) {
    
        $http.jsonp('http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json', {
            params: {
                limit : 16,
                country : 'us',
                apikey: 'rssd8z7pfw5t4nyd3cpszzzm',
                callback: 'JSON_CALLBACK'
            }
        })
        .success(function (data) {
            $scope.movies = data.movies;
        });
    
    });
    
    
    //added ngroute
    var app = angular.module('movies', ['ngRoute']);
    app.config(
        function($routeProvider) {
            $routeProvider.
                when('/', {templateUrl:'/'}).
                when('/movie/:id', 
                    {   
                        controller:UserView, 
                        templateUrl: function(params){ return '/moviessssssss/' + params.id; }
                    }
                ).
                otherwise({redirectTo:'/'});
        }
    );
    app.controller('UserView', function($scope) {
        $scope.movies = 'hereeeeeee!';
    });
    
    <html ng-app="movies">
    
    <head>
    <link rel="stylesheet" hrf="//netdna.bootstrapcdn.com/font-awesome/4.0.0/css/font-awesome.css" />
    <script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.5/angular-route.min.js"></script>
    </head>
    
    <body>
          <div class="ng-scope">
                Search : <input type="text" placeholder="filter for..." >
          </div>
          <div ng-view>
           {{ message }}
              <table ng-controller="movieController" class="ng-cloak">
                    <tr ng-repeat="movie in movies">
                        <td><a ng-href="#movie" ><img ng-src="{{ movie.posters.thumbnail}}"/></a></td>
                        <td><a ng-href="#movie"  > {{ movie.title }} </a></td>
                    </tr>
              </table>
         </div>
    &#13;
    &#13;
    &#13;

3 个答案:

答案 0 :(得分:1)

获取链接:

ng-href="{{'/#/movie/'+movie.id}}"

然后让过滤器工作,

将ng-model放入搜索框。在你的ng-repeat中添加| filter: ng-modelname

var movies = angular.module("movies", []);

movies.controller('movieController', function ($scope, $http) {

    $http.jsonp('http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json', {
        params: {
            limit : 16,
            country : 'us',
            apikey: 'rssd8z7pfw5t4nyd3cpszzzm',
            callback: 'JSON_CALLBACK'
        }
    })
    .success(function (data) {
        $scope.movies = data.movies;
        console.log($scope.movies);
    });

});
<html ng-app="movies">

<head>
<link rel="stylesheet" hrf="//netdna.bootstrapcdn.com/font-awesome/4.0.0/css/font-awesome.css" />
<script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.5/angular-route.min.js"></script>
</head>

<body>
      <div class="ng-scope">
            Search : <input type="text" placeholder="filter for..." ng-model="search">
      </div>
      <div ng-view>
       {{ message }}
          <table ng-controller="movieController" class="ng-cloak">
                <tr ng-repeat="movie in movies | filter:search">
                    <td><a ng-href="{{'/#/movie/'+movie.id}}" ><img ng-src="{{ movie.posters.thumbnail}}"/></a></td>
                    <td><a ng-href="{{'/#/movie/'+movie.id}}"  > {{ movie.title }} </a></td>
                </tr>
          </table>
     </div>

 

答案 1 :(得分:1)

TL; DR

Click Here 查看实时的plunker示例。

  • 在我的例子中,我使用了bootstrap 。如果不相关则删除

  • 我的plunker中有一个 TODO - 服务器端电影过滤(当您在搜索字段中输入内容时)。 您需要在developer.rottentomatoes.com

  • 中详细了解相关信息

这是我要定义的路由配置:

movies.config(function($routeProvider, $locationProvider) {
  $routeProvider
    .when('/movies', {
      templateUrl: 'movies.html',
      controller: 'MoviesController',
      resolve: {
        movies: function($http) {

          return $http.jsonp('http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json', {
            params: {
              limit: 16,
              country: 'us',
              apikey: 'rssd8z7pfw5t4nyd3cpszzzm',
              callback: 'JSON_CALLBACK'
            }
          });

        }
      }
    })
    .when('/movies/:id', {
      templateUrl: 'movie.html',
      controller: 'MovieController',
      resolve: {
        movie: function($http, $route) {

          var id = $route.current.params.id;

          return $http.jsonp('http://api.rottentomatoes.com/api/public/v1.0/movies/' + id + '.json', {
            params: {
              limit: 1,
              country: 'us',
              apikey: 'rssd8z7pfw5t4nyd3cpszzzm',
              callback: 'JSON_CALLBACK',
              q: id
            }
          });

        }
      }
    })
    .otherwise({
      redirectTo: '/movies'
    });

});
  • /movies - 所有电影的列表
  • /movies/<movie id> - 有关电影的具体详情

注意 - 我使用resolve预取json数据(这是可选的)


的index.html

这是

的主要HTML代码
<!DOCTYPE html>
<html ng-app="movies">

<head>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular-route.js"></script>
  <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">

  <script src="app.js"></script>
</head>

<body>
  <div class="container">
    <div ng-view></div>
  </div>

</body>
</html>

movies.html

电影列表的视图。

我们按<a ng-href="#/movies/{{movie.id}}">

获取特定电影重定向
<input class="form-control" type="text" placeholder="Search ..." ng-model="search" >
<hr>

<table>
  <tr ng-repeat="movie in movies | filter:search">
      <td><a ng-href="#/movies/{{movie.id}}" ><img ng-src="{{ movie.posters.thumbnail}}"/></a></td>
      <td><a ng-href="#/movies/{{movie.id}}"> {{ movie.title }} </a></td>
  </tr>
</table>

movie.html

特定电影的视图

<img class="img-responsive" ng-src="{{ movie.posters.detailed}}"/>

<h3>{{movie.title}} <small>{{movie.year}}</small></h3>
<p>{{movie.synopsis}}</p>
<hr>

<a class="btn btn-default" href="#/movies">Back</a>

<hr>

<pre>{{movie | json}}</pre>

MoviesController

附加到 movies.html 视图的控制器

需要$scope.$watch('search',来查询服务器以了解您所做的每个输入更改。 目前无法正常使用; rottentomatoes.com忽略q参数。您需要在developer.rottentomatoes.com

中详细了解它
movies.controller('MoviesController', function($scope, $http, movies) {

  $scope.search = '';

  $scope.$watch('search', function(newValue) {

    // TODO: you need to request again the movie list from the server. 
    // Read more about the API here:
    // http://developer.rottentomatoes.com/docs/read/json/v10/Movies_Search

    $http.jsonp('http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json', {
      params: {
        limit: 16,
        country: 'us',
        apikey: 'rssd8z7pfw5t4nyd3cpszzzm',
        callback: 'JSON_CALLBACK',
        q: newValue
      },
      headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    })

    .success(function(data) {
      console.log(data);
      $scope.movies = data.movies;
    });

  });

  $scope.movies = movies.data.movies;

});

MovieController

附加到 movie.html 视图的控制器

movies.controller('MovieController', function($scope, movie) {

  $scope.movie = movie.data;

});

实例 - http://plnkr.co/edit/cJXTZWqBUXNTPinf7AoV?p=preview

答案 2 :(得分:-1)

对于你的第一个问题,请执行以下操作:

<td><a ng-href="#/movie/{{movie.id}}"> {{movie.title}} </a></td>