【问题标题】:Angular directive throws off two-way data bindingAngular 指令抛弃了双向数据绑定
【发布时间】:2015-02-01 17:22:04
【问题描述】:

我正在将此 jQuery 自动完成插件改编成指令 - https://github.com/devbridge/jQuery-Autocomplete

我有一个有效的指令:

App.directive('autocomplete', ->
  return {
    restrict: 'A',
    link: ($scope, elem, attr) ->
      console.log(attr.autocomplete)
      elem.autocomplete({
        serviceUrl: '/videos/autocomplete/' + attr.autocomplete
      })
  }
)

但是,当我在自动完成列表中选择某些内容时,双向数据绑定会出现问题,并且只会更新输入。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 这是咖啡脚本吗?
  • 有变化,但是 jquery 插件不会触发摘要。因此,您必须添加一个事件处理程序,以便在发生变化时调用 $scope.$digest
  • @MathewFoscarini 谢谢!我对 $digest 和 $apply 做了一些阅读,但我仍然不知道该放在哪里。有什么见解吗?
  • 我强烈建议您使用 Angular 方式来实现自动完成功能。 jQuery 方式并不适合。这是 ui bootstrap typeahead:angular-ui.github.io/bootstrap/#/typeahead

标签: javascript jquery angularjs data-binding angularjs-directive


【解决方案1】:

Necroposting这篇文章,因为我认为这对很多人来说是有用的,以了解我所指的这篇很棒的帖子:)

Angular 有一种方法可以观察对象的变化,这依赖于 JavaScript 的“回合制”特性。这在this awesome article by Jim Hoskins中解释得很清楚。

基本上,Angular 会检查周期中的变化,但是当这些周期之间发生变化时,它无法知道是否需要再次执行检查! (非常简单的解释;再次参考the article

底线,我们需要通知它我们改变了一些东西,所以假设你的选择触发了一个handler(),它执行了一个action()

您只需将action 包装成$scope.$apply

function handler(){
    $scope.$apply(function(){
        action();
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2015-03-07
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多