2015-07-20 78 views
3

我是角流星應用程序開發的新手,我努力從客戶端對數據庫進行更改。我已經成功完成了大部分angular-meteor tutorial,但現在我試圖啓動一個新項目並調整教程中的概念,我遇到了問題。角流星中客戶端數據庫操作的問題

問題。 用戶填寫表單,當他們點擊「添加」時,表單應該將數據保存到數據庫中。在同一頁面上,我列出了一個顯示所有數據庫條目的列表(典型的「html元素中的元素」循環)。然而,當我填寫表格後,點擊「添加」,新條目將被添加到列表中,然後消失。當我點擊一個「全部刪除」按鈕時,會發生同樣的情況,一切都會消失一段時間然後恢復。持續存在的數據是添加/刪除之前數據庫中的任何數據。

嘗試進行故障排除。我可以用「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> 

/模型/ 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,但它是相當長的,我已經非常非常改變幾乎沒有(從頁面到提交頁面,基本上)。我也沒有包括控制器或視圖負責刪除項目,因爲它似乎是多餘的。

就我有限的知識而言,一切似乎都應該起作用;因此,我有這樣的感覺,解決辦法可能是盯着我。對於解決此問題的後續步驟,您有任何建議嗎?

+0

你可以發佈你的代碼嗎?這將是最有幫助的。 –

+0

已編輯原創帖子。感謝您檢查它!讓我知道你還有什麼想看的東西。 – aliigleed

回答

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

我希望它的作品!

+0

哇,那樣做!多麼簡單的解決方案,非常感謝。我花了很多時間去嘗試其他的東西,但是我相信我真的很接近想出來 - 幾分鐘前我只是在研究'.allow'。我希望別人覺得這很有用! – aliigleed

+0

太棒了!我可以理解爲什麼Meteor預先安裝了'insecure',並且爲什麼'allow'不是默認的,但我認爲當寫入訪問失敗時,他們應該在服務器控制檯中提供某種有用的錯誤消息。不要忘記用支票來解決問題。 – shmck