gpt4 book ai didi

javascript - 将 http GET 响应与 ngRepeat 中的隔离范围绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 07:40:52 25 4
gpt4 key购买 nike

正如标题所暗示的,我试图通过 http get 请求从数据库获取一些数据,然后使用 ngRepeat 将其显示在 div 列表中。我需要对 ngRepeat 的每个重复项调用一个函数,以便请求可以使用该对象(“房间中的房间”中的“房间”)作为 url 参数。我认为问题在于,因为我已经隔离了函数的范围,所以来自 http 请求(计数)的响应似乎超出了函数的范围。我怎样才能做到这一点,以便我可以在 View {{count}} 中显示响应,同时使用该函数将其保持在其自己的隔离范围内?

http

<div ng-repeat="room in rooms">
<div>{{room}}</div><br>
<div plant attrcount="plantCount(room)"></div>
</div>

server.js

MongoClient.connect(process.env.MONGOLAB_URI, function(err, db) {
var plantList = db.collection("plantList");

app.get('/getrooms', function(req, res) {
plantList
.distinct("room", function(err, docs) {
res.json(docs);
});
});

app.get('/getplantsbyroom/:room', function(req, res) {
var roomReq = req.params.room;
plantList.count({"room":roomReq}, function(err, count) {
res.json(count);
});
});

});

controller.js

angular.module('myApp').controller('AppCtrl', function($scope, $http) {

$http.get('/getrooms').success(function (response) {
$scope.rooms = response;
});

$scope.plantCount = function(room) {
var url = '/getplantsbyroom/' + room;
$http.get(url).success(function (response) {
$scope.count = response;
})
}
});

angular.module('myApp').directive("plant", function() {
return {
scope: {
attrcount:"&"
},
template: '<p ng-init="attrcount(room)">{{count}}</p>' //doesn't display count
}
});

最佳答案

在 Controller 中使用之前,最好将所有数据放在一起,而不是尝试将其加载到 ng-reapeat 中。 Angular 的 $q服务可以帮助您将多个 promise 一起加入$q.all .为了保持简洁,您可以创建自己的服务来管理您的请求并将其注入(inject)到您的 Controller 中。

controller('AppCtrl', function($scope, RoomService) {
RoomService.listRooms().then(function(rooms) {
$scope.rooms = rooms;
});
}).service("RoomService", function($http, $q) {
var roomService = {};
roomService.listRooms = function() {
return $http.get("rooms").then(function(rooms) {
return $q.all(rooms.map(roomService.getPlantCount));
});
}
roomService.getPlantCount = function(room) {
return $http.get('/getplantsbyroom/' + room).then(function(plantCount) {
return {
room: room,
plantCount: plantCount
};
});
}
return roomService;
})

angular.module('myApp', []).
controller('AppCtrl', function($scope, RoomService) {
RoomService.listRooms().then(function(rooms) {
$scope.rooms = rooms;
});
}).service("RoomService", function($httpMock, $q) {
var roomService = {};
roomService.listRooms = function() {
return $httpMock.get("rooms").then(function(rooms) {
return $q.all(rooms.map(roomService.getPlantCount));
});
}
roomService.getPlantCount = function(room) {
return $httpMock.get('/getplantsbyroom/' + room).then(function(plantCount) {
return {
room: room,
plantCount: plantCount
};
});
}
return roomService;
}).service("$httpMock", function($q) {
var $httpMock = {};
$httpMock.get = function(url) {
return (url === "rooms") ?
$httpMock.mockRooms() : $httpMock.mockPlantCount(url);
}

$httpMock.mockRooms = function() {
var deferred = $q.defer();
deferred.resolve(["lorem", "ipsum"]);
return deferred.promise;
}

$httpMock.mockPlantCount = function(url) {
var deferred = $q.defer();
if (url === "/getplantsbyroom/lorem") {
deferred.resolve(3);
} else {
deferred.resolve(15);
}
return deferred.promise;
}
return $httpMock;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="AppCtrl">
<div ng-repeat="room in rooms">
<div>{{room.room}}</div>
<br>
<div>{{room.plantCount}}</div>
</div>
</div>

关于javascript - 将 http GET 响应与 ngRepeat 中的隔离范围绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com