Meteor:无法订阅数据

时间:2016-04-24 14:18:39

标签: meteor

不知怎的,我解决了我的问题。

我没有使用 Meteor.methods ,然后我开始使用它们。

我仍然没有使用订阅,发布内容。

---解决方案---

在server / methods.js

if (Meteor.isServer) {
    Meteor.methods({
        insertDoc: function(someValueToInsert1, someValueToInsert2) {
            return Docs.insert({
                owner: Meteor.user().username,
                type: someValueToInsert1,
                files: someValueToInsert2
            });

            // `return Docs.insert()` function because
            // Docs.insert returning the _id value of
            // this entry. And i will use the _id value
            // at client side.

            // For ex.: Insert doc and go to doc page
            // Used router like this:
            // http:// ... /document/:id/view
            // http:// ... /document/:id/edit
            // http:// ... /document/:id/general

        }
    });
}

在client / upload.js

if (Meteor.isClient) {
    Template.upload.events({
        'click #uploadButton': function(){

            // Some variable definitons
            // like someValueToInsert1, someValueToInsert2 etc

            Meteor.call('insertDoc', someValueToInsert1, someValueToInsert2);

            // That's all.
            // But you can add your callback your Meteor.call function
            // To pass data from server to client like:

            Meteor.call('insertDoc', someValueToInsert1, someValueToInsert2, function(error, result) {
                if(!error) Router.go('seeUploadedDataByID', { id: result });
            });
        }
    });
}

---我的问题是---

尝试了太多方法。

我的应用:用户可以创建文档。 Docs是一个集合。

如果用户创建了doc,则将doc id推送到Meteor.user()。profile.docs。

我做了什么:

方式1:在Router.js

Router.route("/docs", {
    "name": "docs",
    data: function(){
        var userDocs = Meteor.users.find({_id: thisId}, {fields: {"profile.docs": 1}});;
        return Docs.find({_id: {$all: userDocs}});

        // console.log(Docs.find({_id: {$all: userDocs}}))
        // This console.log returns a weird data, not what i want
        // It looks like Mongo function
    }
});

方式2:在server / publishs.js

Meteor.publish("myDocs", function() {
    return Meteor.users.find({_id: this.userId}, {fields: {"profile": 1}});
    // Actually i wanted to reach userData first
    // If i can reach datas, i will try to reach profile.docs
});

然后在client / docs.js

Template.docs.onCreated(function() {
    this.subscribe("myDocs");
});

然后在client / docs.html中

{{#if Template.subscriptionsReady}}
    {{#each myDocs}}
        {{this.docs}}
        {{this.profile}}
        {{this}}
        {{this[0]}}</div>
    {{/each}}
{{else}}
    Loading...
{{/if}}

当我渲染时,表示装载..然后没有任何吸引力。

Way3:在client / docs.js

Template.docs.helpers({
    myDocs: function(){
        var docs = Meteor.user().profile.docs;
        var docsArr = [];
        for (var i=0;i<docs.length;i++){
            var doc = Docs.findOne({_id: docs[i]});
            docsArr.push(doc);
        }
        return docsArr;
    }
});

我想在清醒的时候解决这个问题。

问:我应该创建一个新的用户集合并将docId推入其中吗?

1 个答案:

答案 0 :(得分:0)

默认情况下,会发布用户名,电子邮件和个人资料。 所以你可以尝试这个解决方案:

router.js

Router.route('/docs', {
    name: 'docs',
    waitOn: function() {
        if(Meteor.user()){
            return Meteor.subscribe('myDocs', Meteor.user().profile.docs);
        }
    }
});

服务器/ publishs.js

Meteor.publish("myDocs", function(docs) {
    return Docs.find({_id: {$in: docs}});
});

的客户机/ docs.html

{{#each myDocs}}
    {{title}}
    {{description}}
{{/each}}

的客户机/ docs.js

Template.docs.helpers({
    myDocs: function(){
        return Docs.find();
    }
});