angular-meteor 中的客户端数据库操作出现问题
Trouble with client-side database operations in angular-meteor
我是 angular-meteor 应用程序开发的新手,我正在努力从客户端对数据库进行更改。我已经成功完成了大部分 angular-meteor tutorial,但现在我正在尝试开始一个新项目并调整教程中的概念,我 运行 遇到了问题。
问题。
用户填写表单,当他们单击 "add," 时,表单应将数据保存到数据库中。在同一页上,我包含了一个显示所有数据库条目的列表(html 列表中的典型 "element in elements" 循环)。但是,当我在填写完表格后单击 "add," 时, 新条目被添加到列表中一瞬间,然后消失了 。当我单击 "delete all" 按钮时,会发生相同的行为,所有内容都会消失片刻,然后恢复。保留的数据是 adding/deleting.
之前数据库中的任何数据
尝试进行故障排除。 我可以使用 "meteor mongo," 访问集合,并且持久存在的值在集合中。我可以从命令行添加到集合或从中删除(编辑:并且更改反映在客户端)。在客户端 提交的条目不会 添加到数据库中。我用条件 if (Videos.find().count() === 0)
的服务器端启动函数启动了数据库。我想也许数据库每次都只是重新初始化自己,但是当初始化代码被注释掉时,这种行为仍然存在。添加自动发布项目并不能解决问题。编辑:Google Chrome 在提交之前或之后在控制台中没有任何错误。
相关代码。我使用this repository作为起点。
/client/views/submit/submit.controller.js
angular.module("app").controller("SubmitCtrl", ['$scope', '$meteor',
function($scope, $meteor){
$scope.videos = $meteor.collection(Videos).subscribe('videos');
}
]);
/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>
/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();
});
唯一一个我觉得真正相关的文件是 /client/app.routes.js,但它很长而且我对它的改动非常小(从关于页面到提交页面, 本质上)。我也没有包括负责删除项目的控制器或视图,因为它看起来是多余的。
就我有限的知识而言,一切似乎都应该有效;因此,我觉得解决方案可能正盯着我看。您对解决此问题的后续步骤有什么建议吗?
the new entry is added to the list for a split second and then disappears.
这是latency compensation造成的。基本上,客户端数据库在服务器之前处理它,以使操作发生得更快。这是一个非常有用的功能,但如果您不完全了解它的工作原理,可能很难调试。
我假设您删除了 insecure
包?要测试这是否是问题所在,运行 meteor add insecure
并查看您的应用现在是否正常运行。
如果应用程序在 insecure
安装时只有 运行s,我认为你需要做的是 allow
写入数据库。
Videos.allow({
insert: function () {
// condition where user has write access, return true to allow
if (Meteor.user()) {
return true;
}
},
update: function () {},
remove: function () {}
});
希望有用!
我是 angular-meteor 应用程序开发的新手,我正在努力从客户端对数据库进行更改。我已经成功完成了大部分 angular-meteor tutorial,但现在我正在尝试开始一个新项目并调整教程中的概念,我 运行 遇到了问题。
问题。 用户填写表单,当他们单击 "add," 时,表单应将数据保存到数据库中。在同一页上,我包含了一个显示所有数据库条目的列表(html 列表中的典型 "element in elements" 循环)。但是,当我在填写完表格后单击 "add," 时, 新条目被添加到列表中一瞬间,然后消失了 。当我单击 "delete all" 按钮时,会发生相同的行为,所有内容都会消失片刻,然后恢复。保留的数据是 adding/deleting.
之前数据库中的任何数据尝试进行故障排除。 我可以使用 "meteor mongo," 访问集合,并且持久存在的值在集合中。我可以从命令行添加到集合或从中删除(编辑:并且更改反映在客户端)。在客户端 提交的条目不会 添加到数据库中。我用条件 if (Videos.find().count() === 0)
的服务器端启动函数启动了数据库。我想也许数据库每次都只是重新初始化自己,但是当初始化代码被注释掉时,这种行为仍然存在。添加自动发布项目并不能解决问题。编辑:Google Chrome 在提交之前或之后在控制台中没有任何错误。
相关代码。我使用this repository作为起点。
/client/views/submit/submit.controller.js
angular.module("app").controller("SubmitCtrl", ['$scope', '$meteor',
function($scope, $meteor){
$scope.videos = $meteor.collection(Videos).subscribe('videos');
}
]);
/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>
/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();
});
唯一一个我觉得真正相关的文件是 /client/app.routes.js,但它很长而且我对它的改动非常小(从关于页面到提交页面, 本质上)。我也没有包括负责删除项目的控制器或视图,因为它看起来是多余的。
就我有限的知识而言,一切似乎都应该有效;因此,我觉得解决方案可能正盯着我看。您对解决此问题的后续步骤有什么建议吗?
the new entry is added to the list for a split second and then disappears.
这是latency compensation造成的。基本上,客户端数据库在服务器之前处理它,以使操作发生得更快。这是一个非常有用的功能,但如果您不完全了解它的工作原理,可能很难调试。
我假设您删除了 insecure
包?要测试这是否是问题所在,运行 meteor add insecure
并查看您的应用现在是否正常运行。
如果应用程序在 insecure
安装时只有 运行s,我认为你需要做的是 allow
写入数据库。
Videos.allow({
insert: function () {
// condition where user has write access, return true to allow
if (Meteor.user()) {
return true;
}
},
update: function () {},
remove: function () {}
});
希望有用!