角度流星中的客户端数据库操作出现问题

时间:2015-07-20 01:18:11

标签: angularjs mongodb meteor angular-meteor

我是角度流星应用程序开发的新手,我正在努力从客户端对数据库进行更改。我已经成功完成了大部分angular-meteor tutorial,但是现在我正在尝试启动一个新项目并调整教程中的概念,我遇到了问题。

问题。 用户填写表单,当他们点击"添加时,"表单应该将数据保存到数据库中。在同一页面上,我列出了一个显示所有数据库条目的列表(典型的"元素中的元素" html列表中的循环)。但是,当我点击"添加,"在填写表单后,新条目将暂时添加到列表中,然后消失。当我点击"删除全部"按钮,一切都消失片刻,然后恢复。持续存在的数据是添加/删除之前数据库中的数据。

尝试进行问题排查。 我可以使用" meteor mongo访问该集合,"并且持久的值在集合中。我可以从命令行添加到集合或从中删除(编辑:并且更改反映在客户端的末尾)。客户端上提交的条目未添加到数据库中。我使用条件为if (Videos.find().count() === 0)的服务器端启动函数启动了数据库。我想也许数据库每次都只是重新初始化,但是当初始化代码被注释掉时,行为仍然存在。添加自动发布项目并不能解决问题。编辑:谷歌浏览器在提交之前或之后在控制台中没有任何错误。

相关代码。 我使用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,但它很长,我在其中的变化很小(从页面到提交页面,基本上) 。我还没有包含负责删除项目的控制器或视图,因为它似乎是多余的。

就我有限的知识而言,一切似乎都应该起作用;因此,我觉得解决方案可能正在盯着我的脸。您对解决此问题的后续步骤有什么建议吗?

1 个答案:

答案 0 :(得分:5)

  

新条目将暂时添加到列表中,然后消失。

这是由latency compensation引起的。基本上,客户端数据库在服务器之前处理它,以使操作更快地发生。这是一个非常有用的功能,但如果您不完全掌握它的工作原理,则很难调试。

我假设你删除了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 () {}
});

我希望它有效!

相关问题