AngularJS - 基于API的实时搜索不会因ng模型更改而更新

时间:2015-07-17 17:28:10

标签: javascript angularjs mediawiki-api angularjs-ng-model

我是棱角分明的新人,我开始挣扎着学习曲线。

我正在通过FreeCodeCamp Zipline来制作维基百科搜索应用程序。所需的功能之一是带有文章标题建议的实时搜索,但我似乎无法使其有效。

我已经创建了一个工厂来进行wiki API调用。工厂只能工作一次,并且在对搜索字段进行任何更改时不会更新。我认为它没有工作,因为在对输入字段进行更改时工厂没有被调用,但是我尝试修复的所有内容似乎都无法正常工作。

HTML

<section id="container" ng-app="wikiSearch" ng-controller="searchPanel" class="center">
  <h1>Wikipedia Viewer</h1>
  <input id="search" type="text" placeholder="search" ng-model="searchTerm" ng-model-options="{debounce: 300}"/>
  <section id="results"><a href="#" target="_blank" class="wiki-entry"> </a>
    <!-- test code-->
    <div>{{searchTerm}}</div>
    <div>{{titleSearch}}</div>
  </section>
</section>

的Javascript

var app = angular.module('wikiSearch', []);

app.controller('searchPanel', [ '$scope', 'API', function ($scope, API) {
  $scope.searchTerm = 'einstein';
  $scope.titleSearch = {};
  $scope.searchResults = {};

  var api_base = "https://en.wikipedia.org/w/api.php?";
  var fullParams = "format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=30&prop=extracts&exintro&explaintext&exsentences=2&exlimit=max&gsrsearch="
  //var titles = "format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=8&gsrsearch="
  var callback = "&callback=JSON_CALLBACK"

  API.search(api_base + fullParams + $scope.searchTerm + callback).success(function (data) {
    $scope.titleSearch = data;
  });

}]);


app.factory('API', [ '$http', function ($http) {
  return {
    search: function(targetUrl) {
      console.log(targetUrl);
      return $http.jsonp(targetUrl);
    }
  }
}]);

以下是要查看的原始codepen: Codepen Project

您可以看到对搜索字段的任何更改都不会对返回的json数据产生任何更改。工厂只被召唤一次。

我对角度的工作原理并不十分了解,但我的假设是,对输入字段进行的每次更改都会使工厂更新。显然,我错了,但我很想知道究竟为什么,以及如何解决它。

2 个答案:

答案 0 :(得分:3)

您的代码问题在于,您的搜索输入更改时不会触发API调用。您需要在文本字段中侦听change事件并触发API调用,如下所示。

<强> HTML

    <input id="search" type="text" ng-change="update()" placeholder="search" 
  ng-model="searchTerm" ng-model-options="{debounce: 300}" />

<强>控制器

$scope.update = function(){

   API.search(api_base + fullParams + $scope.searchTerm +callback)
      .success(function (data) {
         $scope.titleSearch = data;
      });

}

这是您更新的CodePen fork,但有以上更改。

答案 1 :(得分:0)

您需要添加事件以检查搜索字段是否已更改。我建议使用ngChange

<强>玉

input#search(type='text' placeholder = "search" ng-model="searchTerm" ng-change='search()' ng-model-options="{debounce: 300}")

<强> JS

     $scope.search = function () {
  API.search(api_base + fullParams + $scope.searchTerm + callback).success(function (data) {
    $scope.titleSearch.data = data;
    console.log($scope.titleSearch);
  });
 }

 $scope.search()

检查codepen