【问题标题】:AngularJS + UI Bootstrap Typeahead implementation issueAngularJS + UI Bootstrap Typeahead 实现问题
【发布时间】:2014-10-08 08:32:33
【问题描述】:

我正在尝试通过采用此代码来使用我的 Web Api 控制器实现 Typeahead,效果很好:

HTML

<div class='container-fluid' ng-controller="TypeaheadCtrl2">
    <pre>Model: {{result | json}}</pre>
    <input type="text" ng-model="result" typeahead="suggestion for suggestion in cities($viewValue)">
</div>

app.js 中的控制器

myApp.controller('TypeaheadCtrl2', function ($scope, $http, limitToFilter) {

    //http://www.geobytes.com/free-ajax-cities-jsonp-api.htm

    $scope.cities = function (cityName) {
        return $http.jsonp("http://gd.geobytes.com/AutoCompleteCity?callback=JSON_CALLBACK &filter=US&q=" + cityName).then(function (response) {
            return limitToFilter(response.data, 15);
        });
    };
});

但是,当我将 return $http.jsonp("http://gd.geobytes.com/AutoCompleteCity?callback=JSON_CALLBACK &amp;filter=US&amp;q=" + cityName) 更改为调用我自己的 WebApi 控制器 return $http.jsonp("api/airports/" + cityName) 时,它停止工作。

但如果我直接调用我的 Web Api,比如http://mysite:80/api/airports/los,它会返回这个 json:

["San Martin DeLos Andes (CPC)","San Carlos DeBariloche (BRC)","Los Menucos (LMD)","Paso De Los Libres (AOL)","Barbelos (BAZ)","Los Angeles (LSQ)","Los Chiles (LSL)","Mali Losinj (LSZ)","Milos (MLO)","Volos (VOL)","Paso Caballos (PCG)","Los Mochis (LMM)","Vilanculos (VNX)","San Carlos (NCR)","Lagos (LOS)","Losuia (LSA)","Lossiemouth (LMO)","Los Angeles (JID)","Los Angeles (JBP)","Los Alamos (LAM)","Los Angeles (LAX)","Los Banos (LSN)","Lost Harbor (LHB)","Lost River (LSR)","San Carlos (SQL)","Los Angeles, CA (VNY)","Los Angeles (WHP)","Los Roques (LRV)"]

http://gd.geobytes.com/AutoCompleteCity?filter=US&amp;q=los返回的格式完全相同:

["Los Alamitos, CA, United States","Los Alamos, CA, United States","Los Alamos, NM, United States","Los Altos, CA, United States","Los Angeles, CA, United States","Los Banos, CA, United States","Los Ebanos, TX, United States","Los Fresnos, TX, United States","Los Gatos, CA, United States","Los Indios, TX, United States","Los Lunas, NM, United States","Los Molinos, CA, United States","Los Ojos, NM, United States","Los Olivos, CA, United States","Los Osos, CA, United States","Losantville, IN, United States","Lost City, WV, United States","Lost Creek, KY, United States","Lost Creek, PA, United States","Lost Creek, WV, United States"]

请指教。

【问题讨论】:

  • 你的 Web API 和 angularjs 应用是否在同一个域中?
  • 是的,它们在同一个域中。
  • 同域然后你不需要 jsonp,但如果你想让 jsonp 与 web api 一起工作,你必须安装格式化程序

标签: angularjs autocomplete angular-ui-bootstrap typeahead search-suggestion


【解决方案1】:

尝试使用“$http.get”将承诺与“$scope.cities”的分配分开:

myApp.controller('TypeaheadCtrl2', function ($scope, $http, limitToFilter) {

    $http.get("http://gd.geobytes.com/AutoCompleteCity?callback=JSON_CALLBACK &filter=US&q=" + cityName).then(function (response) {
        $scope.cities = limitToFilter(response.data, 15);
    });
});

【讨论】:

  • 谢谢伙计。上面的解决方案已经解决了我的问题,我相信它和你的类似。只是更精致。我开始掌握 Angular,但还远远不够。
  • 哦,是的,它们都是等价的,我只是不想将这些东西与各种functions 和returns 混为一谈,javascript 有时会很混乱,哈哈。接下来您可以查找的一件好事是如何创建服务并将所有 $http 请求放入其中,因此您的控制器不需要 $http 或端点地址。
  • 再次感谢。我最近的目标是为所有 Angularjs 控件(建议列表、下拉菜单、日历、路由等)建立概念验证场景,这样我就可以开始将我的 WebForms 应用程序转换为带有迷你 spa 的 Angular 应用程序。对于使用 Angular 进行搜索功能的模态弹出窗口,您可以指出任何示例吗?
【解决方案2】:

如果您的 Web Api 与您的 angularjs 应用程序在同一个域中,则无需使用 JSONP(而且您的 Web Api 似乎不支持 JSONP)。

你可以像这样使用一个简单的 GET 请求:

$scope.cities = function (cityName) {
    return $http.get("api/airports/" + cityName).then(function (response) {
        return limitToFilter(response.data, 15);
    });
};

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我认为您的 typeahead 需要一个 JSON 对象。您的 API 正在返回 javascript 数组。它应该可能以以下格式返回:

    {['CITY1', 'CITY2', 'CITY3']}

    【讨论】:

    • 但是正如我上面提到的,如果我直接在我的 url 地址中运行 web api,它写入页面的字符串与 Google 的 gd.geobytes.com/AutoCompleteCity 网络服务写入页面的字符串完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多