1

我正在使用带有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="address for address in getLocation($viewVlue) 触发的,但他们没有在模型上使用观察者。他们的 getLocations 方法是我的 getSpecificationTemplatesNames 方法。

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

4

2 回答 2

0

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

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

于 2018-04-13T10:35:49.703 回答
0

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

哈姆部分:

 %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
于 2018-04-13T13:02:24.163 回答