【问题标题】:Redirect to link using Angular UI Directive Typeahead使用 Angular UI Directive Typeahead 重定向到链接
【发布时间】:2013-06-28 04:08:00
【问题描述】:

我正在为一个项目使用 Angular UI Bootstrap 预输入指令,我想根据预输入中选择的内容重定向到动态 URL。我正在尝试使用预先输入作为搜索框。

我查看了文档(尝试使用 RTFM),所以我知道有一个可以使用的 typeaheadOnSelect 属性,但我不确定如何将它与链接联系起来。我正在使用对象的 JSON 文件,每个对象都有一个特定的 ID。我希望能够像这样直接在 typeahead 属性中链接:

<div class='container-fluid' ng-controller="TypeaheadCtrl">
        <input type="text" id="search" ng-model="selectedPerson" typeahead="person as person.name for person in person | filter:$viewValue" typeahead-min-length="3" typeaheadOnSelect="#/100_Ages/{{person.id}}" ng-init="" />
    </div>

但这没有用。我想我需要一个特定的控制器,但我不确定。 typeahead 指令似乎工作得很好,所以我想有一个简单的解决方案,但我找不到它。

现在,我的 Typeahead 控制器如下所示:

function TypeaheadCtrl($scope, $http) {
  $http.get('person.json').success(function(data) {
      $scope.person = data;
      });
}

This plunkr 显示一切正在运行。我的这个项目的路由器是使用基于每个 JSON id 的动态 URL 设置的,如下所示:

angular.module('app', ['ui.bootstrap']).
    config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/app/:personId', {templateUrl: 'partials/person.html', controller: DetailCtrl}).
    }]);

【问题讨论】:

    标签: angularjs angular-ui-bootstrap


    【解决方案1】:

    您可以观察 selectedPerson 模型的变化。这是一个例子:

    function TypeaheadCtrl ($scope, $http, $location, $log, $timeout) {
      $http.get('person.json').success(function(data) {
          $scope.person = data;
      });
      $scope.$watch('selectedPerson', function(newValue, oldValue) {
        if (newValue){
          $log.info('/100_Ages/' + $scope.selectedPerson.id);
          $location.path('/100_Ages/' + $scope.selectedPerson.id);
        }
      });
    }
    

    更新:更新到 v0.4.0 后,我能够做到这一点:

    function TypeaheadCtrl ($scope, $http, $location, $log, $timeout) {
      $http.get('person.json').success(function(data) {
          $scope.people = data;
      });
      $scope.onSelect = function($item, $model, $label){
        $scope.$item = $item;
        $scope.$model = $model;
        $scope.$label = $label;
        $log.info($scope.$item);
        $log.info($scope.$model);
        $log.info($scope.$label);
        $location.path('/person/' + $scope.$item.id);
      }
    }
    

    然后在 HTML 中,我这样做了:

    <input type="text" id="search" placeholder="Search for a name or age" ng-model="selectedPerson" typeahead="person.id as person.name for person in people | filter:$viewValue" typeahead-on-select="onSelect($item, $model, $label)" typeahead-min-length="3" ng-init="" />
    

    【讨论】:

    • 太棒了,谢谢。这几乎就在那里,但它试图在预先输入甚至可以显示下拉选项列表之前选择某人。理想情况下,我希望它显示该搜索的所有可能选项,然后他们选择一个,然后重定向。这可能吗?
    • 这更接近了。该链接正在重定向,但它会将自己定向到项目主页(该链接具有 100_Ages/0 链接作为覆盖某人在第一人称页面上向后滑动的路线可能性)。 Here is a hosted version of the site,所以你可以明白我的意思。点击放大镜调出搜索。如果您在某人的名字被突出显示时检查它,您会在链接上看到一个标签索引“-1”。我认为这是问题的根源,但我不确定为什么会发生这种情况。感谢大家的帮助!
    • 查看我的评论,标签索引记录的是“-1”而不是每个人的 id。也想看看是不是我的问题。
    • 啊,想通了。 $location.path 上的路线不正确,但那是因为我在 Plunkr 示例中使用了更通用的路线。非常感谢您的帮助,否则永远不会想到这一点。
    • 太棒了。很高兴我能帮上忙。
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 2016-06-26
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多