【发布时间】:2016-05-22 04:57:12
【问题描述】:
我已经尝试解决这个问题好几个小时了,并试图在堆栈溢出和其他网站上找到一个可行的解决方案,但到目前为止都没有奏效。
问题
我正在构建一个 Travelogue Web 应用程序,允许用户记录和查看他们的旅程(例如公路旅行)。目前,我正在实现允许用户在从旅程列表中选择的单独视图中查看特定旅程的功能。我传递所选旅程的 id 并从 MongoDB 检索对象。我使用 POST 实现了这一点。它的工作原理是所选旅程的 _id 在请求中传递,然后用于使用 Model.findById 标识文档 - 然后响应产生数据。数据绑定到 $scope.selection。
但是,虽然 $scope.selection 包含数据(登录到控制台时),但我似乎无法将其绑定到视图(称为 view_journey)。意思是,每当我想访问时,例如在我的 view_journey.html 中的 selection.name,表达式或 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 放在同一个模板中,以测试您的数据流。或者,您必须提供有关应用程序结构的更多信息。
-
每当控制器附加到您的视图时,都会创建一个具有自己作用域的控制器的新实例。每当路由触发时都会发生这种情况,即使您使用具有不同模板的相同控制器也是如此。这意味着您的数据实际上并不存在于新控制器的范围内,除非您以某种方式将其放在那里。通常这是由工厂或服务部门完成的。我会仔细看看你的代码,看看我能看到什么。
-
谢谢,那太好了。
标签: angularjs rest express mongoose ng-bind