【问题标题】:$http get request successful but not displayed in view$http 获取请求成功但视图中没有显示
【发布时间】:2016-01-28 02:52:41
【问题描述】:

我正在使用来自 google Books API 的 API 使用 Angular 的 $http.get(..)。我希望输入字段存储可以存储在查询字符串中的用户输入:'/q=/key=....'

当我提交搜索字段时,请求成功,但未显示信息。我已经为此工作了一段时间,但仍然卡住了。会不会是我的控制器?或者我如何设置请求? 结果就是这样:

这是代码。

app.controller("HomeController", ['$scope', '$location', 'bookSearch',function($scope, $location, bookSearch){
$scope.website="CoolMark";
$scope.books= '';
$scope.submit= function () {
    if($scope.books === ''){
        alert('Field is empty');
        console.log('not working');
        return false;
    } else {

        $location.path('/search');
        bookSearch($scope.books).success(function(data){
        $scope.searchResult= data;
        }); 
        console.log(typeof $scope.books);

    }
};
}]);

现在开始服务...

app.factory('bookSearch', ['$http', function($http){
    return function(info){
       return $http.get('https://www.googleapis.com/books/v1/volumes?q='+info+'&orderBy=relevance&filter=ebooks&key=AIzaSyCpWB1q0-kqFEH9f5Sh8xUrXfrhoxAG7wk')
        .success(function(data){
            return data;
        })
        .error(function(err){
            return err;
        });
    };
}]);

任何建议如何改进此代码?至于视图,这里是:

<div class="feature">
  <div class="container">
    <h3>Return Home</h3>
    <h2 class="text-center">Your Results for: "{{books}}"</h2>
    <div class="book_content">
       <div ng-repeat="item in searchResult.items" id="book-item">
            <img ng-src="{{item.volumeInfo.imageLinks['thumbnail']}}" alt="">
                <h5>{{item.volumeInfo.title}}</h5>
                <p>{{}}</p>
       </div>
    </div>
  </div>
</div> 

【问题讨论】:

  • 尝试删除工厂中的.success and .error 处理程序
  • 视图没有发生任何变化。我认为这是需要改变的观点?
  • 你能把请求返回的数据贴出来吗?我创建了一个 plunker,与您所拥有的不完全相似,但请看一下 plnkr.co/edit/nrF4JIoAr3DfGKalUXuH?p=preview
  • 我更新了一张照片结果是空的,什么都没有。好吧,除了请求之外,我在视图中放置的内容没有任何问题。也许是我的控制器什么的。

标签: angularjs http view controller request


【解决方案1】:

$timeout 传递给控制器​​:

app.controller("HomeController", 
    ['$scope', '$location', '$timeout', 'bookSearch',
      function($scope, $location, $timeout, bookSearch) {

然后做

$timeout(function() {
    $scope.searchResult= data;
});

许多异步更新发生在摘要周期之外。 $timeout() 使更新等到下一个摘要周期,以便 Angular 看到更改并更新视图。

更新:工厂代码更新:

app.factory('bookSearch', ['$http', function($http){
    var factory = {}
    factory.getBooks = function(info){
       return $http.get('[your url]')
    };
    return factory;
}]);

然后进行搜索:

bookSearch.getBooks($scope.books).success(function(data){ ...

【讨论】:

  • 我不确定我是否根据您的输入做对了,或者它仍然没有显示出来嗯......我基本上是这样做的: bookSearch($scope.books).success (function(data){ $timeout(function() { $scope.searchResult=data; }); });不知道对不对。
  • 嗯。您是否在控制台中收到任何错误? $timeout 必须传递给控制器​​。我会更新答案以显示它
  • 给你看图片会很好,但我尝试了另一种方法,没有 $timeout。现在 $scope.books 不会在用户搜索某些内容时更新请求中的 q= 。控制台说 400 它缺少一个文本字符串。我确实使用了 ng-model= 'books' 并将它传递给 bookSearch($scope.books) 但控制台没有说任何附加到 q= ;如果我输入 bookSearch('Harry Potter') 而不是从模型中搜索它会起作用。奇怪... :)
  • 尝试如上更新您的工厂。我相信工厂应该返回一个对象,服务应该返回一个函数(如果我没记错的话)
  • 也许如果您提供更多的 html,我们可以构建一个小提琴并找出问题所在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2020-04-07
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多