2015-07-20 3 views
3

Я новичок в разработке приложений в угловом метеор, и я изо всех сил стараюсь внести изменения в базу данных с клиентской стороны. Я успешно завершил большую часть angular-meteor tutorial, но теперь, когда я пытаюсь запустить новый проект и адаптировать концепции из учебника, у меня возникают проблемы.Проблема с работой базы данных на стороне клиента в угловом метеоре

Проблема. Пользователи заполняют форму, и когда они нажимают «добавить», форма должна сохранять данные в базе данных. На той же странице я включил список, в котором отображаются все записи базы данных (типичный цикл «элемент в элементах» в списке html). Однако, когда я нажимаю «добавить», после заполнения формы, новая запись добавляется в список на долю секунды, а затем исчезает. Такое же поведение возникает, когда я нажимаю кнопку «удалить все», все исчезает на мгновение, а затем восстанавливается. Сохраняемые данные - это все, что было в базе данных, перед добавлением/удалением.

Попытки устранения неполадок. Я могу получить доступ к коллекции с помощью «meteor mongo» и значения, которые сохраняются в коллекции. Я могу добавить в коллекцию или удалить ее из командной строки (EDIT: и изменения отражаются на конце клиента). Записи, представленные на стороне клиента , не добавлены в базу данных. Я инициировал базу данных с помощью функции запуска на стороне сервера с условием if (Videos.find().count() === 0). Я думал, что, возможно, база данных просто обновляла себя каждый раз, но поведение сохраняется, когда код инициализации закомментирован. Добавление автоопубликации проекта не решает проблему. EDIT: 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 поставляется с предустановленной «неуверенной», и почему 'allow' не имеют значения по умолчанию, но я думаю, что они должны предоставить какое-то полезное сообщение об ошибке на консоли сервера, когда сбой доступа к записи завершится неудачей. Не забудьте закрыть вопрос с чеком. – shmck