AngularJS - API-based 实时搜索不会因 ng-model 更改而更新
AngularJS - API-based live search won't update with ng-model change
我是 angular 的新手,我开始在学习曲线上挣扎。
我正在通过 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 数据产生任何更改。工厂只被调用一次。
我不太了解 angular 的工作原理,但我的假设是工厂会随着输入字段的每次更改而在范围内更新。显然,我错了,但我很想确切地知道为什么,以及如何解决它。
您的代码存在问题,您没有触发 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。
您需要添加事件来检查搜索字段是否已更改。我建议使用 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
我是 angular 的新手,我开始在学习曲线上挣扎。
我正在通过 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 数据产生任何更改。工厂只被调用一次。
我不太了解 angular 的工作原理,但我的假设是工厂会随着输入字段的每次更改而在范围内更新。显然,我错了,但我很想确切地知道为什么,以及如何解决它。
您的代码存在问题,您没有触发 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。
您需要添加事件来检查搜索字段是否已更改。我建议使用 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