【问题标题】:ngTagsInput Autocomplete does not OpenngTagsInput 自动完成未打开
【发布时间】:2017-07-10 19:28:29
【问题描述】:

我无法显示自动完成列表。我的服务返回 json 模型:TagID: 1, text:MyText 但自动完成列表永远不会显示。我的 HTML:

<tags-input ng-model="tags" tag-class="{even: $index % 2 == 0, odd: $index % 2 != 0}" on-tag-added="addTag(tags)"> <auto-complete source="loadTags($query)"></auto-complete> </tags-input>

我的控制器代码:

$scope.loadTags = function ($query) {
  var tags;
  contractorService.gettags()
  .success(function (data) {
    tags = data;
    return tags.filter(function(tag) {
    return tag.text.toLowerCase().indexOf($query.toLowerCase()) != -1

更新

我发现它只是不喜欢从 Ajax 调用返回到 MVC 控制器的 Json。

        public async Task<ActionResult> GetMajorTags()
    {
        majorId = UserInfo.intMajorID;
        var tags = await CompanyClient.GetAvailableTags(majorId);
        return Json(tags, JsonRequestBehavior.AllowGet);
    }

甚至绕过服务直接调用MVC控制器方法如下:

    $scope.loadTags = function (query) {
    return $http.get('/SSQV4/SSQV5/Contractor/GetMajorTags');

};

如果我将源设为静态,如下所示:

    var auto = [
    { TagID: 4,text: 'Tag4' },
    { TagID: 5, text: 'Tag5' },
    { TagID: 6, text: 'Tag6' }
];

它可以工作,但它不会显示从 MVC 控制器返回的内容,即使返回的数据格式完全相同。

非常感谢任何帮助!

【问题讨论】:

  • 为什么你的loadTags方法中有return语句?这在服务回调的上下文中没有意义。

标签: ajax asp.net-mvc ng-tags-input


【解决方案1】:

此代码不正确:

$scope.loadTags = function ($query) {
  var tags;
  contractorService.gettags()
  .success(function (data) {
    tags = data;

    // return where?
    return tags.filter(function(tag) {
      return tag.text.toLowerCase().indexOf($query.toLowerCase()) != -1
    });
  });
}

没有理由在您的 success 回调中包含 return 语句。那会回到哪里?如果你做了这样的事情:

var tags = $scope.loadTags();
console.log(tags);  // undefined

... 标签将未定义。原因是 return 语句没有从对 loadTags 的调用中返回。相反,它是从 Promise 回调中返回的。

实际上是这样完成的:

var tags = [];
$scope.loadTags = function () {
  contractorService
    .gettags()
    .success(function (data) {
      tags = data;
      tags =  tags.filter(function(tag) {
        return tag.text.toLowerCase().indexOf($query.toLowerCase()) != -1;
      });
    });
};

注意没有返回语句(过滤器除外)。

这根本不起作用:

$scope.loadTags = function (query) {
  return $http.get('/SSQV4/SSQV5/Contractor/GetMajorTags');
};

如果你要这样做:

var tags = $scope.loadTags();
console.log(tags);  // promise object. NO DATA

tags 将包含一个承诺对象而不是您的数据。您需要执行以下操作才能获取实际数据:

 var tags = [];
 $scope.loadTags().success(function(data) {
   tags = data;
 });

【讨论】:

  • 感谢@JoelCDoyle 没有任何效果。我的原始代码(带有承诺)是 $scope.loadTags = function ($query) { var tags; contractorService.gettags() .success(function (data) { tags = data; tags.filter(function(tag) { return tag.text.toLowerCase().indexOf($query.toLowerCase()) != -1; } ); }); };这没有用。
  • 然后我尝试了 $scope.loadTags = function (query) { $http.get('/SSQV4/SSQV5/Contractor/GetMajorTags') .then(function(res) { return res.data; }); };这没有用。数据回来了,但它不会显示在自动完成列表中。只有静态文本会显示在列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2017-08-31
相关资源
最近更新 更多