2014-11-24 51 views
0

我正在写一个指令包装器围绕一个typeahead输入。该指令用于监听链接上的更改并获取预先输入的新数据+选项。AngularJS typeahead情绪不是最新的

我可以简单地用$超时模拟这种行为,并在this plnkr.co中演示它。

JS

app.controller('sample', function($scope, $timeout) { 

    $scope.options = ['1800', '1900', '2100']; 

    // Simulate some latency 
    $timeout(function() { 

    $scope.options.push('1850'); 

    }, 4000); 

}); 

HTML

<div> 
    <input type="text" ng-model="optionValue" typeahead="opt for opt in options | filter:$viewValue"> 
</div> 

如果你开始键入它显示1800预期的输入域 '18'。但是,当1850年获得的时间增加后,typeahead的可选选项不会被更新。

- FYI我活生生的指令看起来像这样 -

$scope.$watch($interpolate(url), function (newUrl) { 
    $http.get(newUrl).then(function (response) { 
    $scope.options = response; 
    }); 
}); 

我试图用typeahead="opt for opt in getData()"但这并不工作,因为插入值还没有最新的。它总是落后于一个价值。

回答

0

如果有人对解决方案感兴趣,下面是我现在解决它的方法。我对最终结果不满意,请给我一些反馈:-)。

Plunkr

退房更新-bootstrap.js,我不得不添加下面以使其工作:

的自定义属性为$ watchCollection

var customOptions = attrs.typeaheadCustomOptions || ''; 
那将是使用

在那里得到我添加了一个观看比赛的功能,如果customOptions提供:

if (customOptions) { 
    originalScope.$watchCollection(customOptions, function (matches) { 
      resetMatches(); 
      updateMatches(matches); 
    }); 
} 

而这基本上是:-),updateMatches只是现有代码的抽象。它没有被我和手动更新使用。

var updateMatches = function(matches) { 
     for (var i = 0; i < matches.length; i++) { 
      locals[parserResult.itemName] = matches[i]; 
      scope.matches.push({ 
         id: getMatchId(i), 
         label: parserResult.viewMapper(scope, locals), 
         model: matches[i] 
      }); 
     } 

     scope.query = modelCtrl.$viewValue; 
}; 

开业问题上github

0

似乎是一个问题发布在AngularUI Bootstrap website。每次按键都会选中匹配项,但如果在击键间更改基础数据,则不会更新。我没有看到任何解决方法,除了可能手动触发相应的键输入事件处理程序(当您更改集合时)。

+0

谢谢您的回答,我设法在角ui.js添加一个丑陋的修复来解决该问题。在我发布之前,我会等待更好的答案。我的解决方案只是增加了一个手表,如果它发生变化 - >更新popup – Dieterg 2014-11-24 14:45:15

+0

@DieterGoetelen认为将问题发布到图书馆的GitHub网站(甚至创建拉请求)会更有帮助,并讨论你的解决方案。 – hon2a 2014-11-24 15:30:42

+0

它被张贴为gihub页面上的错误。 – Dieterg 2014-11-24 16:07:08