3

angular-meteor でのアプリ開発は初めてで、クライアント側からデータベースを変更するのに苦労しています。angular-meteor チュートリアルのほとんどを成功裏に完了しましたが、新しいプロジェクトを開始し、チュートリアルの概念を適応させようとしているので、問題が発生しています。

問題。 ユーザーがフォームに入力し、[追加] をクリックすると、フォームはデータをデータベースに保存する必要があります。同じページに、すべてのデータベース エントリを表示するリストを含めました (HTML リストの典型的な「要素内の要素」ループ)。ただし、フォームに入力した後に [追加] をクリックすると、新しいエントリがリストに追加されて一瞬表示されなくなります。「すべて削除」ボタンをクリックすると同じ動作が発生し、すべてが一瞬消えてから元に戻ります。保持されるデータは、追加/削除する前にデータベースにあったものです。

トラブルシューティングを試みます。「meteor mongo」でコレクションにアクセスでき、持続する値はコレクションにあります。コマンドラインからコレクションに追加または削除できます(編集:変更はクライアント側に反映されます)。クライアント側で送信されたエントリはデータベースに追加されません。サーバー側の起動関数を使用してデータベースを開始しました。条件はif (Videos.find().count() === 0). おそらくデータベースは毎回自分自身を再初期化しているだけだと思いましたが、初期化コードがコメントアウトされても動作は持続します。プロジェクトに自動公開を追加しても問題は解決しません。編集: Google Chrome では、送信前または送信後にコンソールにエラーはありません。

関連コード。このリポジトリを出発点として使用し

/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 だけですが、これは非常に長く、ほとんど変更していません (基本的に about ページから submit ページまで)。また、アイテムの削除を担当するコントローラーまたはビューも含めていません。これは冗長に見えるためです。

私の限られた知識に関する限り、すべてが機能しているように見えます。その結果、解決策がおそらく私の顔を見つめているような気がします。この問題をトラブルシューティングするための次のステップについて何か提案はありますか?

4

1 に答える 1

5

新しいエントリが一瞬リストに追加されてから消えます。

これはレイテンシー補正が原因です。基本的に、クライアント側のデータベースはサーバーの前にそれを処理して、操作を高速化します。これは非常に便利な機能ですが、その仕組みを完全に把握していないとデバッグが困難になる可能性があります。

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 () {}
});

うまくいくことを願っています!

于 2015-07-21T06:24:41.520 に答える