1

オートコンプリートで ngTagInput を使用しようとしていますが、次のエラーが発生します:

angular.min.js:117 TypeError: a.filter is not a function
at d (ng-tags-input.min.js:1)
at ng-tags-input.min.js:1
at angular.min.js:130
at n.$eval (angular.min.js:144)
at n.$digest (angular.min.js:142)
at n.$apply (angular.min.js:145)
at l (angular.min.js:97)
at H (angular.min.js:101)
at XMLHttpRequest.u.onload (angular.min.js:102)

HTML

<tags-input ng-model="selectedList">
  <auto-complete source="getData($query)"></auto-complete>
</tags-input>

Javascript

$scope.getData = function(query) { 
  var request = {
    // GET request is defined here
  };

  return $http(request).success(function(response, status) {
    var defer = $q.defer();
    defer.resolve([
      { 'text': 'just' },
      { 'text': 'some' },
      { 'text': 'cool' },
      { 'text': 'tags' }
    ]);
    return defer.promise;
  });
};

プランカー

4

1 に答える 1

1

success連鎖可能ではないメソッドを使用しています。つまり、戻り値を無視するため、getData関数は実際には$httpプロミスを直接返します。Plunker によると、たまたま未定の値に解決されるため、filter is not a functionエラーが発生します。autoCompleteディレクティブは配列を想定しているためです。

then代わりに使用するsuccess必要があります (別の promise 内から値を返すために新しい promise を作成する必要もありません):

$scope.getData = function(query) { 
  ...
  return $http(request).then(function(response, status) {
    return [
      { 'text': 'just' },
      { 'text': 'some' },
      { 'text': 'cool' },
      { 'text': 'tags' }
   ];
  });
}

更新されたプランカー

それは機能しますが、リクエストを発行してからそのレスポンスを破棄するため、あまり意味がありません。応答を処理する必要がない場合は、単純に http promise を直接返すことができます (応答構造がディレクティブに対して有効であると仮定します)。

$scope.getData = function(query) { 
  ...
  return $http(request);
};

最後に、successerrorメソッドの両方が非推奨になりました。代わりに常に使用する必要がありますthen

于 2016-07-27T23:41:13.057 に答える