2017-02-02 4 views
0

Я хочу отправить значение результата из дочернего элемента в родительский. Я использовал Session.set и Session.get, и он отлично работает, но я знаю, что это не хорошая практика, потому что сеансы глобальны. Итак, я хотел попробовать что-то вроде реактивного var или реактивного 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}); 
      } 
     }); 
    }, 
}); 
+0

Возможный дубликат [Как удалить определенный элемент из массива в JavaScript?] (Http: // stackoverflow.com/questions/5767325/how-to-remove-a-specific-element-from-an-array-in-javascript) –

ответ

1

ОК, здесь есть что посмотреть. давайте начнем с чего-то малого.

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

Я думаю, что эта строка предназначена для того, чтобы сказать «если пользователь является администратором». но он действительно говорит: «Если пользователь вошел в систему». если вы имели в виду первый, то измените значение "||" к «& &».

Большая проблема заключается в том, что вы вызываете серверный вызов в помощнике. помощники могут называться снова и снова, поэтому подумайте о них как о чем-то, что просто возвращает данные. он не должен иметь никаких побочных эффектов, таких как вызов сервера или (yikes) повторная маршрутизация пользователя.

так что давайте переместим весь код побочного эффекта в 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') 
    } 
}); 

теперь помощник очень прост, он просто возвращает данные, сохраненные в реактивном вар шаблона:

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

последняя часть устанавливает обработчик для возврата данных к родителю , это плохая форма, чтобы клиент возвращался к своему родителю, поэтому я обычно предоставляю родительскому ребенку функцию, которую он может вызвать. обычно я буду делать это, когда ребенок скажет: «Я сделал свою работу», но здесь мы можем использовать его для предоставления этих данных. я должен буду сделать некоторые предположения относительно того, как выглядит ваш родитель.

<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" 
     } 
    } 
}); 

Помощник родителя возвращает функцию, переданную клиенту. когда клиент вызывает его, он будет выполняться при закрытии родителя. вы можете видеть, что я создал переменную, называемую «шаблон», которая позволит вам, например, получить доступ к реактивным варам, принадлежащим родительскому объекту.

UPDATE: в случае, если обработчик не известен как внутри области Meteor.call(), мы можем попробовать использовать его через реактивный var.

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') 
    } 
}); 
+0

TypeError: Не удается прочитать свойство 'companyNameHandler' из null Я думаю, что проблема в том, что проблема: ' let companyNameHandler = Template.currentData(). companyNameHandler' Метод, который мы называем здесь, принимает идентификатор текущего пользователя, найдите, что компания ведьмы имеет идентификатор этого пользователя внутри своих полей (потому что при создании Компания сохраняет свой идентификатор администратора внутри своих полей) и их метод возвращает имя этой Компании. –

+0

Пожалуйста, покажите мне свой обновленный код. – zim

+0

Я обновил вопрос. –

Смежные вопросы