ali*_*eed 3 mongodb angularjs meteor angular-meteor
我是角度流星应用程序开发的新手,我很难从客户端对数据库进行更改.我已经成功地完成了大部分角度流星教程,但是现在我正在尝试启动一个新项目并调整教程中的概念,我遇到了问题.
问题. 用户填写表单,当他们单击"添加"时,表单应将数据保存到数据库中.在同一页面上,我列出了一个显示所有数据库条目的列表(典型的"元素中的元素"循环在html列表中).但是,当我在填写表单后单击"添加"时,新条目将暂时添加到列表中,然后消失.当我点击"全部删除"按钮时,会发生同样的行为,一切都会消失片刻然后恢复.持续存在的数据是添加/删除之前数据库中的数据.
尝试进行故障排除.我可以使用"meteor mongo"访问该集合,并且持久存在的值在集合中.我可以从命令行添加到集合或从中删除(编辑:并且更改反映在客户端).在客户端提交的条目不会添加到数据库中.我使用条件启动了具有服务器端启动功能的数据库if (Videos.find().count() === 0).我想也许数据库每次都只是重新初始化,但是当初始化代码被注释掉时,行为仍然存在.添加自动发布项目无法解决问题.编辑:谷歌浏览器在提交之前或之后在控制台中没有任何错误.
相关守则.我正在使用此存储库作为起点.
/client/views/submit/submit.controller.js
angular.module("app").controller("SubmitCtrl", ['$scope', '$meteor',
function($scope, $meteor){
$scope.videos = $meteor.collection(Videos).subscribe('videos');
}
]);
Run Code Online (Sandbox Code Playgroud)
/client/views/submit/submit.ng.html
<form>
<label>URL</label>
<input ng-model="newVideo.linkurl">
<label>Description</label>
<input ng-model="newVideo.description">
<button ng-click="videos.save(newVideo); newVideo='';">Add</button>
</form>
<ul>
<li ng-repeat="video in videos">
{{video.linkurl}}
<p>{{video.description}}</p>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
/model/collections.js
Videos = new Mongo.Collection("videos");
/server/publications/videos.js
Meteor.startup(function () {
if (Videos.find().count() === 0) {
var videos = [
{ 'linkurl': 'https://www.youtube.com/watch?v=O7zewtuUM_0',
'description': '1st video'},
{ 'linkurl': 'https://www.youtube.com/watch?v=KSzuiqVjJg4',
'description': '2nd video'},
];
for (var i = 0; i < videos.length; i++)
Videos.insert(videos[i]);
};
});
Meteor.publish("videos", function () {
return Videos.find();
});
Run Code Online (Sandbox Code Playgroud)
我认为唯一真正相关的其他文件是/client/app.routes.js,但它很长,我在其中的变化非常小(从页面到提交页面,基本上).我还没有包含负责删除项目的控制器或视图,因为它似乎是多余的.
就我的有限知识而言,一切似乎都应该起作用; 因此,我觉得解决方案可能正在盯着我的脸.对于解决此问题的后续步骤,您有什么建议吗?
新条目将暂时添加到列表中,然后消失.
这是由延迟补偿引起的.基本上,客户端数据库在服务器之前处理它,以使操作更快地发生.这是一个非常有用的功能,但如果您不完全掌握它的工作原理,则很难调试.
我假设你已经insecure删除了包裹?要测试这是否是问题,请运行meteor add insecure并查看您的应用是否正常运行.
如果应用程序仅在insecure安装时运行,我认为您需要做的是allow写入数据库.
Videos.allow({
insert: function () {
// condition where user has write access, return true to allow
if (Meteor.user()) {
return true;
}
},
update: function () {},
remove: function () {}
});
Run Code Online (Sandbox Code Playgroud)
我希望它有效!
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |