javascript - Meteor - 如何将子函数的值赋予父函数?

标签 javascript json meteor

我想将结果值从子元素发送到父元素。我使用 Session.set 和 Session.get 并且它工作正常,但我知道这不是一个好的做法,因为 session 是全局的。所以,我想尝试像reactive var或reactive dict这样的东西,但是它们都只给了我一个对象。我应该做什么或者如何从该对象中获取特定的东西? (我将 JSON 存储在 ReactiveVar 或 Dict 中,我知道它们对于 JSON 真的很糟糕。谢谢您的帮助!

Template.companyCreate.helpers({
    CompanyName : function () {
        if (Meteor.user() || Roles.userIsInRole(Meteor.user(),['admin','adminCreator'], 'companyAdmin')) {
            Meteor.call('findCompany', function(err, result) {
                if (err) {
                    console.log(err.reason)
                }
                else {
                    //this is where I want to take result and give it to parent function
                }
            });
            return //this is where I want to take result that was given from child function and return it to CompanyName
        }
        else {
            Router.go('/nemate-prava')
        }
    },

更新代码

    Template.companyCreate.onCreated(function Poruke() {
    this.message = new ReactiveVar(' ');

    let self = this;
    let user = Meteor.user();
    let companyNameHandler = Template.currentData().companyNameHandler;
    self.companyName = new ReactiveVar();

    if (user && Roles.userIsInRole(user,['admin','adminCreator'], 'companyAdmin')) {
        Meteor.call('findCompany', function(err, result) {
            if (err) {
                console.log(err.reason)
            }
            else {
                self.companyName.set(result);
                companyNameHandler(result);
                }
            });
        }
    else {
        Router.go('/nemate-prava')
    }
}); 

Template.companyCreate.helpers({
    message: () => { return Template.instance().message.get() },

    isNotInRole : function() {
        if (!Meteor.user() || !Roles.userIsInRole(Meteor.user(),['admin','adminCreator'], 'companyAdmin')) {
            return true;
        }
        else {
            return false;
        }
    },

    CompanyName : function () {
        return Template.instance().companyName.get();
    }
});

Template.companyCreate.events({
    'submit form': function(event, template) {
        var Ime = event.target.Ime.value;
        event.preventDefault();
        Meteor.call('companyCheck', Ime, function(error, result) {       
            if (error) {
                console.log(error.reason);
                template.message.set(error.reason);
                alert(error.reason);
            }
            else {
                event.target.Ime.value = "";
                console.log('Kompanija je uspesno kreirana!');
                template.message.set("Uspesno!");
            }
        })
    },
});

方法:

    'findCompany'(){
        ImeKompanije = firma.findOne({AdminID: this.userId}).ImeKompanije
        if (typeof ImeKompanije == 'undefind') {
            throw new Meteor.Error(err, "Greska!");
        }
        return ImeKompanije;

    },
});

路由器:

    Router.route('/comp/:ImeKompanije', {
    name: 'companyProfile',
    template: 'companyProfile',
    waitOn: function() {
        return Meteor.subscribe('bazaFirmi', this.params.ImeKompanije)
    },
    action: function() {
        this.render('companyProfile', {
            data: function() {
                return firma.findOne({ImeKompanije: this.params.ImeKompanije});
            }
        });
    },
});

最佳答案

好吧,这里有很多东西可以放松。让我们从小事开始。

if (Meteor.user() || Roles.userIsInRole(Meteor.user(),['admin','adminCreator'], 'companyAdmin')) {

我认为这句话的意思是“如果用户是管理员”。但它实际上是在说“如果用户已登录”。如果您指的是第一个,则更改“||”到“&&”。

更大的问题是您正在助手中进行服务器调用。助手可能会被一遍又一遍地调用,因此请将它们视为仅返回数据的东西。它不应该有任何副作用,例如进行服务器调用或(哎呀)重新路由用户。

因此,让我们将所有副作用代码移至 onCreated() 并捕获公司名称,以便可以从帮助程序返回它。我们还将设置将公司名称返回给母公司。

Template.companyCreate.onCreated(function() {
    let self = this;
    let user = Meteor.user();
    let companyNameHandler = Template.currentData().companyNameHandler;

    self.companyName = new ReactiveVar();

    if (user && Roles.userIsInRole(user,['admin','adminCreator'], 'companyAdmin')) {
        Meteor.call('findCompany', function(err, result) {
            if (err) {
                console.log(err.reason)
            }
            else {
                self.companyName.set(result);
                companyNameHandler(result);
                }
            });
        }
    else {
        Router.go('/nemate-prava')
    }
});

现在助手非常简单,它只是返回保存到模板的 react 变量中的数据:

Template.companyCreate.helpers({
    CompanyName : function () {
        return Template.instance().companyName.get();
    }
});

最后一部分是设置处理程序以将数据返回给父级。让客户端返回到其父级是一种不好的形式,因此我通常让父级向子级提供一个它可以调用的函数。通常,当 child 说“我已经完成了我的工作”时,我会这样做,但在这里我们可以使用它来提供数据。我必须对你 parent 的长相做出一些假设。

<template name="Parent">
    {{> companyCreate companyNameHandler=getCompanyNameHandler}}
</template>

Template.Parent.helpers({
    getCompanyNameHandler() {
        let template = Template.instance();

        return function(companyName) {
            console.log(companyName);
            // you can also access the parent template through the closure "template"
        }
    }
});

父级的助手返回一个传递给客户端的函数。当客户端调用它时,它将在父级闭包中执行。你可以看到我设置了一个名为“template”的变量,它允许你访问属于父级的 react 变量。

更新:如果处理程序在 Meteor.call() 范围内未知,我们可以尝试通过响应式(Reactive)变量使用它。

Template.companyCreate.onCreated(function() {
    let self = this;
    let user = Meteor.user();
    self.companyNameHandler = new ReactiveVar(Template.currentData().companyNameHandler);

    self.companyName = new ReactiveVar();

    if (user && Roles.userIsInRole(user,['admin','adminCreator'], 'companyAdmin')) {
        Meteor.call('findCompany', function(err, result) {
            if (err) {
                console.log(err.reason)
            }
            else {
                self.companyName.set(result);
                let fn = self.companyNameHandler.get();
                fn(result);
            }
        });
    }
    else {
        Router.go('/nemate-prava')
    }
});

关于javascript - Meteor - 如何将子函数的值赋予父函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42001077/

相关文章:

php - Android:从 JSON 获取数据

java - Meteor Mongo 和 Android 应用程序共享数据库

meteor - 显示从 Autoform MeteorMethod 调用抛出的错误消息的最佳方法是什么

javascript - 在 JavaScript 中从数组创建对象

javascript - 从网络访问 firebase 数据库

javascript - Jquery 验证 - 领域焦点

php - cakephp 和 Webhooks

json - 如何对 jq 中的 map 数组中的值求和?

meteor - 跟踪记录/文档更改?

javascript - Gulp,Mocha,观看不重新加载我的源文件