如何组合Meteor.publish / Subscribe和collection.allow?

时间:2014-06-25 01:17:48

标签: meteor

我尝试编写一些代码来理解Meteor.publish / subscribe和collection.allow 现在它没有任何错误但是我无法将数据插入到我的集合中。 testing.html

<head>
  <title>testing</title>
</head>

<body>
<div class="container">
    <div class="col-xs-2">
        {{> loginButtons}}
    </div>
    <div class="col-xs-10">
        {{> gettingContent}}
    </div>
</div>
</body>

<template name="gettingContent">
  <h1>These are all my contents.</h1>
  {{#each gettingAll}}
  {{title}}
  {{author}}
  {{/each}}
  {{#if currentUser}}
  <h2 class="alert">{{denie}}</h2>
  <p>Title: <input type="text" id="title"/></p>
  <p>Author: <input type="text" id="author"/></p>
  <p><input type="button" value="Click" id="action" /></p>
  {{/if}}
</template>

model.js

Content = new Meteor.Collection("Content");

Meteor.methods({
    creatingContent: function(options) {
        check(options, {
            title: String,
            author: String,
            date: new Date()
        });

        Content.insert({
            title: options.title,
            author: options.author,
            date: options.date
        });
    }
});

Content.allow({
    insert: function(userId) {
        if(Meteor.userId() === true){
            return true;
        } else {
            return false;
        }
    }
});

clientTesting.js

Template.gettingContent.helpers({
    gettingAll : function(){
        return Meteor.subscribe("getAll");
    }
});

var options = {
                title: $("#title").val(),
                author: $("#author").val(),
                date: new Date()
            };

Template.gettingContent.events({
    'click #action' : function(event,options) {
        event.preventDefault();
        if(Meteor.userId() === true) {
            Meteor.call("creatingContent",options);
            console.log("Content was created.");
            $("#title").val("");
            $("#author").val("");
        }else{
            Session.set("deny", "You must be login for creating content.");
        }
    }
});

serverTesting.js

Meteor.publish('getAll', function(){    
    if(Content.find().count() === 0){
        return Session.set("noData", "Data not found'");
    } else {
        return Content.find({},{sort:{'date':-1}});
    }
});

3 个答案:

答案 0 :(得分:1)

我没有测试此代码,但date: new Date()行不正确。它应该是Date

   check(options, {
        title: String,
        author: String,
        date: Date
    });

答案 1 :(得分:1)

我相信你的问题就在这里:Meteor.userId() === true

默认情况下,Meteor userId是字母数字字符串。如果userId存在,则对true的相等性的测试总是错误的。

试试这个:

if (Meteor.userId()) {
    return true;
} else {
    return false;
}

甚至更简单:

return !!Meteor.userId();

答案 2 :(得分:0)

好的每个人我都解决了一些代码问题,只有两点我不明白1.如何使用Meteor.subscribe与模板? 2.如何呈现显示我的数据。我得到了这样的错误

Exception from Deps recompute function: Error: {{#each}} currently only accepts arrays, cursors or falsey values. 

testing.html

<head>
  <title>testing</title>
</head>

<body>
<div class="container">
    <div class="col-xs-2">
        {{> loginButtons}}
    </div>
    <div class="col-xs-10">
        {{> gettingContent}}
    </div>
</div>
</body>

<template name="gettingContent">
  <h1>These are all my contents.</h1>
  {{#each gettingAll}}
  <p>Title: {{title}}, Author: {{author}}</p>
  {{/each}}
  <h2 class="alert">{{denies}}</h2>
  {{#if currentUser}}
  <p>Title: <input type="text" id="title"/></p>
  <p>Author: <input type="text" id="author"/></p>
  <p><input type="button" value="Click" id="action" /></p>
  {{/if}}
</template>

clientTesting

Template.gettingContent.helpers({
    gettingAll : function(){
        return Meteor.subscribe('getAll') && Content.find().count() ;
    },
    denies: function(){ 
        return Session.get("deny"); 
    }
});


var options1 = function(title, author){     
                var title = $("#title").val();
                var author = $("#author").val();
                if(_.isString(title) && !_.isEmpty(title) && _.isString(author) && !_.isEmpty(author) ){
                    var result = {title: title, author: author};
                    return result;  
                }else{
                    console.log("Invalid Data")
                }
            };


Template.gettingContent.events({

    'click #action' : function(event) {
        event.preventDefault();
        Session.set("options", options1());
        var options = Session.get("options");
        if(Meteor.userId() && !_.isEmpty(options)) {
                Meteor.call('creatingContent',options, function(){
                    console.log("Content was created.");
                });
            $("#title").val("");
            $("#author").val("");
            return Session.set("deny", "Your Data was created.");
        }else {
            return Session.set("deny", "Invalid Data.");
        }
    }
});

model.js

Content = new Meteor.Collection("Content");

Meteor.methods({
    creatingContent: function(options) {
        check(options, {
            title: String,
            author: String
        });

        if(options.title.length === 0)
            throw new Meteor.Error(413, "noData Passed");
        if(options.author.length === 0)
            throw new Meteor.Error(413, "noData Passed");

        Content.insert({
            title: options.title,
            author: options.author,
            date: new Date().getTime()
        });
    }
});

Content.allow({
    insert: function(userId) {
        if(Meteor.userId() === true){
            return true;
        } else {
            return false;
        }
    }
});

serverTesting.js

Meteor.publish('getAll', function(){
        return Content.find({},{sort:{'date':-1}});
});