AngularJS - Typeahead异步数据

时间:2018-04-13 09:45:42

标签: angularjs coffeescript angular-ui-bootstrap typeahead debounce

我正在使用带有anguarJS的Typeahead引导程序从rails api获取数据,问题是每次我在输入中输入一个字母时请求获取数据,我想要执行并减少一点请求的数量和对它进行辩护以使输入的内容与检索到的数据相匹配。

这是控制器:

 getSpecificationTemplatesNames = (value) ->
    dataStore.post DATASTORE_CACHE_KEY, "/specification_templates/specification_templates_names",{post: {search: value}},(data) ->
      $scope.names = data.templates.names


  # --- WATCHER ---

  $scope.$watch 'specificationTemplate.name', (value)  ->
    $scope.specificationDisabledForm = !value
    getSpecificationTemplatesNames(value)

这是haml部分:

 .col-md-8
          %input.specification-template-name{ type: 'text', name: 'name', typeahead: 'name for name in names | filter:$viewValue | limitTo:15', typeahead_wait_ms:'2000',
                        ng: { model: 'specificationTemplate.name', disabled: 'contractPeriod.isArchived()' }}

在ui-bootstrap doc示例版本 0.12.1 中,异步加载是通过typeahead =“getLocation($ viewVlue)中地址的地址触发的,但是他们没有在模型上使用观察者。他们的getLocations方法是我的getSpecificationTemplatesNames方法。

可以帮助执行此操作并使用我的代码转换并使用coffeescript正确使用typeahead-wait-ms选项!

2 个答案:

答案 0 :(得分:0)

您的问题是您没有正确定义typeahead-wait-ms。您在属性名称中有下划线,而不是破折号。

此外,您可以使用ng-model-options="{'debounce': ...}"为模型更新添加去抖动。

答案 1 :(得分:0)

这是我找到的解决方案,使用承诺:

haml part:

 %input.specification-template-name{ type: 'text', name: 'name', typeahead: 'name for name in getSpecificationTemplatesNames($viewValue) | limitTo:15', typeahead_wait_ms:'1000',
                        ng: { model: 'specificationTemplate.name', disabled: 'contractPeriod.isArchived()' }}

angularjs控制器:

$scope.getSpecificationTemplatesNames = (value) ->
    $q( (resolve, reject) ->
     dataStore.post DATASTORE_CACHE_KEY, "/specification_templates/specification_templates_names",{post: {search: value}},(data) ->
        resolve( data.templates.names || [] )
    )

  # --- WATCHER ---

  $scope.$watch 'specificationTemplate.name', (value)  ->
    $scope.specificationDisabledForm = !value