我的问题来自所选的答案here
<ui-select-choices repeat="hero in getSuperheroes($select.search) | filter: $select.search">
<div ng-bind="hero"></div>
可以完美地与以下项目配合使用:
$scope.getSuperheroes = function(search) {
var newSupes = $scope.superheroes.slice();
if (search && newSupes.indexOf(search) === -1) {
newSupes.unshift(search);
}
return newSupes;
}
但是,当我在
$scope.superheroes
上设置断点时,我看到它的调用次数与我的数据一样多。数据非常大。它是从$http.get()
请求中获取的,我正在处理一次不将数据立即加载到文本框中的问题。但是,在实际开始在文本框中键入任何内容之前,我不希望调用此函数。我尝试使用以下方式致电
getSuperheroes
on-select="getSuperheroes($select.search)"
同样
refresh="getSuperheroes($select.search)"
但它们无助于手动输入数据。
我该如何使用它来调用该函数,却又完成了任务,就像它在引用的答案中的工作方式一样?
最佳答案
我建议您这样做:
为了提高性能,请删除repeat="hero in getSuperheroes($select.search) | filter: $select.search"
,因为如果您的数据不变,则每次执行getSuperheroes
时(无论var $digest
是否更改)都会触发(无论如何)函数newSupes
。在getSuperheroes
中)(那是wahat正在发生!)。而是放入(例如)repeat="hero in myHeroes"
,然后在您的getSuperheroes
函数中执行以下操作:
$scope.getSuperheroes = function(search) {
var aux = $scope.superheroes.slice();
if (search && aux.indexOf(search) === -1) {
aux.unshift(search);
}
$scope.myHeroes = aux;
}
保留
refresh="getSuperheroes($select.search)"
,这将通过调用getSuperheroes
搜索新值,这将更新$scope.myHeroes
var,然后在视图中刷新它。添加属性
refresh-delay="500"
(500只是一个示例,请放置满足您需要的任何内容)。这将使搜索延迟几毫秒。当您不想立即开始搜索时,此功能很有用。例如,如果用户要搜索“超人”并且在少于500毫秒内键入“ Sup”,则搜索将从字符串“ Sup”开始。如果未设置该属性,则搜索将执行3次(一次为“ S”,另一次为“ Su”,第三次为“ Sup”)PS:
-如果要最初获取具有某些值的ui-select,则必须在控制器启动时调用
getSuperheroes
函数。-您可能需要声明
$scope.myHeroes = []
;在控制器的开头(取决于您的控制器实现)。-您可能想在AngularJS官方文档上阅读有关
$digest
的更多信息,所以有一些相关的文章:How exactly does the AngularJS Digest Loop work?
Why do i have to call $scope.$digest() here?
Angular $scope.$digest vs $scope.$apply
$apply vs $digest in directive testing