Как заставить ngTagsInput работать с ответом из asticsearch

Я использую эластичный поиск для хранения тегов и хочу, чтобы ngTagsInput извлекал их динамически для автозаполнения. Это работает до точки, где ngTagsInput получает ответ от asticsearch, где я получаю следующую ошибку в консоли браузера:

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use
'track by' expression to specify unique keys. Repeater: item in 
suggestionList.items track by track(item), Duplicate key: undefined, 
Duplicate value:{"_index":"data","_type":"tags","_id":"4","_score":1,"_source":{"id":4,"text":"Testinchen"}}

Проблема здесь в том, что полученное обещание содержит массив из 4 элементов (если бы у меня было больше репутации, я бы выложил здесь картинку, но нет, переполнение стека не даст мне:x)

Я всю ночь пытался заставить ngTagsInput принять это обещание, и лучшее, что мне удалось сделать, - это каким-то образом получить мой объект, если есть только один удар от упругого поиска, а не несколько.

HTML-код выглядит следующим образом:

<div data-ng-controller="TagsController">
    <tags-input ng-model="taglist">
        <auto-complete source="loadTaglist($query)"template="tagTemplate"></auto-complete>
    </tags-input>
</div>
<script type="text/ng-template" id="tagTemplate">
    <span ng-bind-html="$highlight($getDisplayText())"></span>
    <div ng-repeat="model in data._source">
        @{{model}}
    </div>
</script>

@ Перед {{ model }} здесь потому, что он работает на бэкэнде Laravel, так что не берите в голову ^^

И JS является следующим:

petopia.controller('TagsController', function($scope, tags, esClient) {

    $scope.taglist = [{
        "id" : "1",
        "text": "Pet"
    }];

    $scope.loadTaglist = function(query) {
        var taglist = esClient.search({
            q: "*"+query+"*"
        }).then(function (response) {
            return response.hits.hits;
        }, function (error) {
            console.trace(error.message);
        });

        return tags.load(taglist);
    };
});

petopia.service('tags', function($q) {
    this.load = function(taglist) {

        var deferred = $q.defer();
        deferred.resolve(taglist);
        console.log(deferred.promise);
        return deferred.promise;
    };
});

Любая помощь будет принята с благодарностью, так как я совершенно не в себе, как новичок в angularjs.

1 ответ

Вы должны отслеживать это по индексу, когда у вас есть дубликаты в вашем массиве.

ng-repeat="model in data._source track by $index"

Другие вопросы по тегам