繁体   English   中英

为什么我选择的ng-model无法反映我选择的ng-option?

[英]Why does my select ng-model not reflect my selected ng-option?

我正在尝试获取此代码以在我的select ng-options提供一个值:

<select ng-model="selectedMovieId" ng-if="movies.length>0" ng-options="movie.id as movie.title for movie in movies track by movie.id"></select>
  <div>
    {{selectedMovieId||'No movie selected'}}
  </div>

但是我从没有看到selectedMovieId的值。 我试图在ng模型中添加一个点(类似于foo.selectedMovieId ),但我一直在出错。

阅读了3-4个问题后,我觉得这很简单,我想念了。

这是我的完整代码:

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

app.controller("movieCtrl", ["$scope", "$http", function($scope, $http) {
  $scope.apiKey = ''
  var baseUrl = 'https://api.themoviedb.org/3/'
  $scope.movies = []
  $scope.searchMovie = function() {
    var url = baseUrl + 'search/movie?api_key=' + $scope.apiKey + '&query=' + $scope.queryString;
    $http.get(url)
      .then(function(response) {
        $scope.movies = response.data.results;
      }, function() {
        console.log("some error");
      })
  }
  $scope.getCredits = function() {
    var url = baseUrl + 'movie/' + $scope.selectedMovieId + '/credits?api_key=' + $scope.apiKey
    console.log(url)
    console.log($scope.movies)
      /*$http.get(url)
          .then(function(response) {
              console.log(response.data)
              $scope.actors = response.data.results;
          }, function() {
              console.log("some error");
          })*/
  }
}]);

和html:

<div ng-app="movieApp" ng-controller="movieCtrl">
  <input type='text' ng-model='queryString' ng-submit="searchMovie()">
  <button ng-click="searchMovie()">
    Search
  </button>
  <hr/>
  <select ng-model="selectedMovieId" ng-if="movies.length>0" ng-options="movie.id as movie.title for movie in movies track by movie.id">
  </select>
  <div>
    {{selectedMovieId||'No movie selected'}}
  </div>
  <button ng-if="movies.length>0" ng-click="getCredits()">
    Get Credits
  </button>
</div>

和我一直在工作的jsfiddle 。为什么不更新ng-model

没有提供一些数据,演示无法正常工作,但是我怀疑您的问题打破了始终在ng-model使用对象的黄金法则

ng-if创建一个子作用域,并且该子作用域会像您当前正在执行的那样破坏原语的2种方式绑定

在控制器中设置一个对象,以便继承可用于后续子作用域,然后在视图中将ng-model绑定到该对象

@charlietfl的答案是正确的。 ng-if创建了一个子范围,因此您将无法像这样访问您的selectedMovieId

如果出于某种原因需要使用原始类型进行绑定,则可以按以下方式更改绑定(这只是一种解决方法)

 <select ng-model="$parent.selectedMovieId" ng-if="movies.length>0" ng-options="movie.id as movie.title for movie in movies track by movie.id"> </select> 

之所以会起作用,是因为它使用了当前$scope的隐式$parent属性。

阅读更多:

  1. 了解范围

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM