从返回的 MongoDB 对象更新 Angular.js $scoped
Update Angular.js $scoped from returned MongoDB object
我目前一直在 MEAN 堆栈中构建 CRUD 应用程序。但是我遇到了一个我似乎无法解决的潜在问题。
一个简短的概述是我有很多博客文章并且想要基本分页以在 ng-click 事件上加载更多帖子(基于 _id)我可以获取数据但我在更新 $scope 时遇到问题与新获取的对象。
加载更多帖子 HTML:
<div ng-click="loadMoreBlogPosts(post._id)" ng-show="$last">Load more</div>
在我的 Angular 控制器中:
// All Blog Posts (This works fine)
$scope.allPosts = function() {
$scope.posts = Blog.Posts.query();
}
// Load More Blog Posts
$scope.loadMorePosts = function(id) {
/* Current Issue */
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts.push(data) /* This doesn't work */
})
}
Angular 型号:
return {
Posts: $resource('/api/blog', {}, {
query: { method: 'GET', isArray: true },
add: { method:'POST', isArray:false },
}),
MorePosts : $resource('/api/moreposts/:id', {}, {
query: { method: 'GET', isArray: true, params:{ id:'@id' } }
}),
Post: $resource('/api/blog/post/:id', {}, {
query: { method: 'GET', isArray: true, params:{ id:'@id' } },
add: { method:'POST', isArray:false },
update: { method:'PUT', isArray:false, params:{ id:'@id' } },
delete: { method:'DELETE', params:{ id:'@id' } }
}),
}
Mongoose/MongoDB/Node 控制器:
exports.posts = function(req, res, next) {
// Blog Posts
Blog.find()
.sort('-created')
.limit(3)
.find(function (err, posts) {
// Check
if(err) {
// Error
return next(err)
} else {
// Success
res.json(posts)
}
})
};
exports.moreposts = function(req, res, next) {
//console.log(req.params.id);
// Blog Posts
Blog.find({"_id": { "$lt": req.params.id }})
.sort('-created')
.limit(2)
.find(function (err, posts) {
// Check
if(err) {
// Error
return next(err)
} else {
// Success
res.json(posts)
console.log(posts);/* Showing in Terminal */
}
})
};
这让我困惑了几个小时。我确定我一定是忽略了一些相当简单的事情,或者事实上我的逻辑是完全不正确的(我希望是前者)任何帮助或指导将不胜感激。
附带说明一下,如果触发了 loadMoreBlogPosts 函数,则执行以下操作:
$scope.posts = Blog.MorePosts.query({id:id})
以上将显示更改 $scope.posts 以显示从 Node/mongo 控制器返回的对象。这说明逻辑没问题,我只是还需要想办法将数据附加到$scope.posts,而不是替换它。
以下:
$scope.posts.push(data);
将新数组添加到现有数组的末尾,使其成为嵌套数组。
你想要的是将旧数组与新数组合并,而不是替换旧数组。
以下应该有效:
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts.push.apply($scope.posts, data);
});
如果您使用的是track by
,例如:
<div ng-repeat="post in posts track by post.id">
那么你重新创建原始数组就没有关系了,然后可以使用 concat
:
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts = $scope.posts.concat(data);
});
我目前一直在 MEAN 堆栈中构建 CRUD 应用程序。但是我遇到了一个我似乎无法解决的潜在问题。
一个简短的概述是我有很多博客文章并且想要基本分页以在 ng-click 事件上加载更多帖子(基于 _id)我可以获取数据但我在更新 $scope 时遇到问题与新获取的对象。
加载更多帖子 HTML:
<div ng-click="loadMoreBlogPosts(post._id)" ng-show="$last">Load more</div>
在我的 Angular 控制器中:
// All Blog Posts (This works fine)
$scope.allPosts = function() {
$scope.posts = Blog.Posts.query();
}
// Load More Blog Posts
$scope.loadMorePosts = function(id) {
/* Current Issue */
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts.push(data) /* This doesn't work */
})
}
Angular 型号:
return {
Posts: $resource('/api/blog', {}, {
query: { method: 'GET', isArray: true },
add: { method:'POST', isArray:false },
}),
MorePosts : $resource('/api/moreposts/:id', {}, {
query: { method: 'GET', isArray: true, params:{ id:'@id' } }
}),
Post: $resource('/api/blog/post/:id', {}, {
query: { method: 'GET', isArray: true, params:{ id:'@id' } },
add: { method:'POST', isArray:false },
update: { method:'PUT', isArray:false, params:{ id:'@id' } },
delete: { method:'DELETE', params:{ id:'@id' } }
}),
}
Mongoose/MongoDB/Node 控制器:
exports.posts = function(req, res, next) {
// Blog Posts
Blog.find()
.sort('-created')
.limit(3)
.find(function (err, posts) {
// Check
if(err) {
// Error
return next(err)
} else {
// Success
res.json(posts)
}
})
};
exports.moreposts = function(req, res, next) {
//console.log(req.params.id);
// Blog Posts
Blog.find({"_id": { "$lt": req.params.id }})
.sort('-created')
.limit(2)
.find(function (err, posts) {
// Check
if(err) {
// Error
return next(err)
} else {
// Success
res.json(posts)
console.log(posts);/* Showing in Terminal */
}
})
};
这让我困惑了几个小时。我确定我一定是忽略了一些相当简单的事情,或者事实上我的逻辑是完全不正确的(我希望是前者)任何帮助或指导将不胜感激。
附带说明一下,如果触发了 loadMoreBlogPosts 函数,则执行以下操作:
$scope.posts = Blog.MorePosts.query({id:id})
以上将显示更改 $scope.posts 以显示从 Node/mongo 控制器返回的对象。这说明逻辑没问题,我只是还需要想办法将数据附加到$scope.posts,而不是替换它。
以下:
$scope.posts.push(data);
将新数组添加到现有数组的末尾,使其成为嵌套数组。
你想要的是将旧数组与新数组合并,而不是替换旧数组。
以下应该有效:
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts.push.apply($scope.posts, data);
});
如果您使用的是track by
,例如:
<div ng-repeat="post in posts track by post.id">
那么你重新创建原始数组就没有关系了,然后可以使用 concat
:
Blog.MorePosts.query({id:id}, function(data) {
$scope.posts = $scope.posts.concat(data);
});