Javascript 在AngularJS中,如何独立呈现列表中的不同项
我是AngularJS的新手,即使花了几个小时,我也无法在互联网上找到以下问题的答案 请随意建议一个更好的方法,我在下面尝试的 请参阅我的AngularJS正在进行的工作代码:Javascript 在AngularJS中,如何独立呈现列表中的不同项,javascript,web-services,twitter-bootstrap,angularjs,Javascript,Web Services,Twitter Bootstrap,Angularjs,我是AngularJS的新手,即使花了几个小时,我也无法在互联网上找到以下问题的答案 请随意建议一个更好的方法,我在下面尝试的 请参阅我的AngularJS正在进行的工作代码: <li ng-repeat="result in getResults()" ng-controller="resultController"> <div class="name_style"> {{result.name}} </div> <!--fetch m
<li ng-repeat="result in getResults()" ng-controller="resultController">
<div class="name_style">
{{result.name}}
</div>
<!--fetch more details for each result and set to $scope.resultDetail-->
<div class="name_detail_style" ng-bind=getDetails(result.name) ng-controller="resultDetailController">
{{resultDetail.image}}
{{resultDetail.description}}
</div>
</li>
我已经创建了一个plunk,展示了如何使用服务和指令来实现您所说的结果。关键是在指令链接时,id与指令关联。然后,detailId上的$watch被用来触发第二个调用
要在整个项目中使用此功能,您必须更新服务以使用$http或$resource调用从服务器获取内容。您不能(意味着真的不应该)引用模板中的AJAX调用包装函数。不管它不是“角度方式”(模板不应该弄乱数据,ng repeat就是调用ajax函数的方式),它都会中断,因为您正在为每个渲染周期进行ajax调用(并且为返回的数组中的每个元素再调用一次!)
您应该能够(并且很可能希望)控制何时从后端/API获取信息,并使用它进行工作,直到您想要刷新它/提交任何更改。因此,要做的主要事情是改变:
<li ng-repeat="result in getResults()" ng-controller="resultController">
这样做的目的是在实例化控制器时调用AJAX请求一次
<>你可以为ReultDeLigBuffor做同样的事情,但是考虑它是否值得。只有当主要结果不太可能改变(每次改变时,请求都会重复)或者细节代表大量数据时,才应该将这些调用分开,并且您确实需要快速显示结构,只有这样,细节才会显示出来
同时,只考虑调用元素的细节,例如,用户“打开它”。
编辑、回复以下评论 正如我所说的,您应该将信息(模型以及获取和更新模型的AJAX请求)与模板和显示分离开来。也就是说,你需要决定什么是最好的:- 您可以预先获取所有信息,然后进行过滤(仅过滤显示的信息)或
- 您可以从后端获取一组经过筛选的元素
您直接将模型设置为函数调用,这是不典型的。(我以前从未见过这种情况)。大多数情况下,您会看到
ng repeat=“result in results”
,其中results
实际上是在控制器中定义的,例如$scope.results=getResults()代码>。但是,您也应该发布一些控制器代码或工厂/服务代码,以便获得完整答案。好的,也发布控制器代码。+1获取代码和解释。虽然不确定它是否解决了我的问题,但我也不知道如何在现有代码中使用指令。是否可以将总共10个result.id的数组发送到getDetails()。因为getDetails()的服务可以接受多个逗号分隔格式的结果。这样,不会为每个结果调用getDetails,性能将在可接受的范围内。我的项目列表范围是10-30个结果。因此,在最坏的情况下,getDetails只会被触发3次,而不是30次。在这种情况下,我会将列表发送给一个函数,如get details,但是我不会让getDetails做这项工作,相反,我会让$resource查询获取集合,并且仍然有一个不同的get detail函数,该函数从内存变量中提取(仍在服务中)对于每个细节。您不一定需要指令,但是您确实需要服务加上控制器中的手表来执行后期绑定回调。哦,至于如何使用指令,请将它们视为包装块,以包含您重复执行的部分功能。它们用于创建更具语义的cod创建方法e、 正如Misko Henvry所说,angular教授了浏览器新的技巧。它可以做到这一点,但允许您创建独立的代码块(指令),这些代码块可以作用于应用程序并为应用程序创建新的语法。实际上,我试图缩小所讨论的代码示例getResults()在我的项目中,也有一些基于用户输入的过滤,并且每次都需要刷新以遵守用户的过滤参数。问题仍然存在-您需要能够告诉angular何时需要刷新(您真的不想每秒执行30多个请求!)我将编辑我的答案以包含一个示例。感谢您的编辑和回答。为了澄清,我认为当页面加载时,只会调用一次GetResults,但是,getDetails(result)将被调用30多次,这是我提出并希望避免的主要问题。在我的情况下,“getDetails”是所有服务中最慢的,因为它需要在后端进行所有计算。而且,我仍然需要在屏幕上向用户显示每个结果的详细信息,因为没有该结果是无关的。看起来您将从中受益后端优化(将结果记录为缓存信息等),但这只是一种感觉,超出了您的问题范围。您的初始代码是错误的,因为它导致多次发出相同的请求,我的回答似乎解决了这一问题。除此之外,这是一个策略和规划问题
<li ng-repeat="result in getResults()" ng-controller="resultController">
<li ng-repeat="result in myResults" ng-controller="resultController">
function resultController($scope, $http) {
$scope.getResults = function() {
$http({method: 'GET', url: resultURL= timeout: maxTime})
.success(function (data, status, headers, config) {
console.log(data);
$sope.result=data;
})
.error(function (data, status, headers, config) {
if (status == 0) {
serviceTimedoutError($scope, data, status, config);
} else {
serviceFailure($scope, data, status, config);
}
})
};
$scope.myResults = $scope.getResults();
};
$scope.$watch("filterString", function(){
$scope.myResults = $scope.getResults($scope.filterString);
}
$scope.$watch("filterString", function(){
$scope.getResultsTimeout.cancel();
$scope.getResultsTimeout = $timeout(
function(){
$scope.myResults = $scope.getResults($scope.filterString);
},
500);
}