我一直试图解决这个问题几个小时,并试图找到堆栈溢出和其他网站的工作解决方案,但目前为止还没有工作。无法将POST响应对象绑定到我的视图
的问题
我建立一个游记web应用程序,允许用户登录和查看他们的行程(例如一个客场之旅)。目前,我正在实施该功能,让用户可以在单独的视图中查看他们从旅程列表中选择的特定旅程。我传递选定旅程的id并从MongoDB中检索对象。我使用POST实现了这一点。它的工作原理是所选行程的_id在请求中传递,然后用于使用Model.findById标识文档 - 然后响应产生数据。数据绑定到$ scope.selection。
但是,虽然$ scope.selection包含数据(当记录到控制台)时,我似乎无法将其绑定到视图(称为view_journey)。意思是,只要我想访问,例如selection.name在我的view_journey.html中,表达式或ng-bind留空。
app.js
$scope.viewJourneybyId = function(id) {
var selectOne = { _id : id };
$http.post('http://localhost:8080/view_journey', selectOne).
success(function(data) {
$scope.selection = data;
$scope.$apply();
console.log("POST found the right Journey");
console.log($scope.selection);
}).error(function(data) {
console.error("POST encountered an error");
})
}
server.js
app.post("/view_journey", function(request, response, next) {
Journeys.findById(request.body._id, function(error, selection) {
if (error)
response.send(error)
response.json({ message: 'Journey found!', selection });
});
});
的index.html
<tr ng-repeat="journey in journeys">
<td>
<a href="#/view_journey" ng-click="viewJourneybyId(journey._id)">
{{journey.name}}</a>
</td>
<td>...</td>
</tr>
view_journey.html
<div class="panel panel-default">
<div class="panel-heading">
<h2 ng-bind="selection.name"></h2>
<!-- For Debugging -->
ID <span ng-bind="selection._id">
</div>
<div class="panel-body">
<table class=table>
<caption>{{selection.desc}}</caption>
...
</table>
</div>
</div>
反馈 这是我的堆栈溢出的第一个问题,所以也请告诉我,如果我我的措辞在可能被误解的方式问题,以及是否不是我应该提供更多细节,例如控制台输出。谢谢;)
index.html和view_journey.html如何相关?它看起来像你有一个角路由发射,如果这样(通常)创建一个新的控制器实例与一个单独的范围,所以它可能是$ scope.selection真的是未定义的。尝试将view_journey.html放在与index.html相同的模板中,以测试您的数据流。或者,您必须提供有关应用程序结构的更多信息。 – tokkov
是的,我在我的app.js文件中设置了一个路径,但是我只使用一个控制器(mainCtrl)作为整个应用程序(是的,我知道,我应该尽快更改)...所以我不认为这是问题。此外,以完全相同的方式设置的其他路线也可以访问相似的数据集。 下面是路由和mainCtrl的完整app.js文件: [app.js](https://github.com/supernoir/travelogue/blob/master/app/scripts/app.js) 这里是我的server.js [server.js](https://github.com/supernoir/travelogue/blob/master/app/server.js) –
无论何时控制器连接到您的视图,都会创建一个控制器的新实例有自己的范围。即使您使用具有不同模板的相同控制器,每当路线发生火灾时也会发生这种情况。这意味着你的数据实际上并不存在于新控制器的范围内,除非你以某种方式将其放在那里。通常这是通过工厂或服务完成的。我会仔细看看你的代码,看看我能看到什么。 – tokkov