【问题标题】:Updating model value in Angular Bootstrap UI typeahead在 Angular Bootstrap UI typeahead 中更新模型值
【发布时间】:2013-09-20 20:27:54
【问题描述】:

我正在使用Angular Bootstrap UI typeahead尝试更新预输入中的模型值。但更新后的模型值不会反映更改,除非特别应用。

<input ng-model="query" typeahead="option for option in getOptions($viewValue)">

app.controller('MainCtrl', function($scope) {
  $scope.query = '';
  $scope.getOptions = function(query){
    if(query == "foo"){
      $scope.query = "foobar";
      // uncommenting the next line works but also raises error
      // $scope.$apply()
      return []
    }
    return ["I have an idea", "I have new idea"];
  }
});

Plunker 代码: http://plnkr.co/edit/pNxBMgeKYulLuk7DO0gB?p=preview

【问题讨论】:

    标签: angularjs angular-ui angular-ui-bootstrap


    【解决方案1】:

    您可以通过查看$scope.query 的值来完成此操作。

    $watch中,newValueoldValue分别代表$scope.query改变前后的值。

    $scope.$watch("query", function(newValue, oldValue){
      if (newValue !== oldValue) {
        if (newValue === "foo") {
          $scope.query = "foobar";
        }
      }
    });
    

    http://plnkr.co/edit/Fsj8KWuSzr9VTMkKB9wO?p=preview

    【讨论】:

    • 感谢乔纳森,这很好。我仍然无法理解为什么在 getOptions() 中更新模型不起作用,而 $watch 起作用?
    • 我可以注意到的一点是没有$scope.apply() 方法。但是有一个 $scope.$apply() 也会导致 $apply 的错误已经在进行中。
    • 是的,我错过了$。我试图避免 $apply() 的事情。
    • 我相信它正在成功地将$scope.query 更改为 foobar。然而,在getOptions() 中更改之后,typeahead 出现并在整个范围变量上踩踏,看看这里plnkr.co/edit/i2l0z5EIiUUujVhAlJig?p=preview,如果你在控制台中查看,你会看到 getOptions 被触发,更改为 foobar,值更改:foo。在更改为 foobar 消息后,该值立即更改回 foo。最有可能通过类型提前指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2018-02-09
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多