2017-02-14 2 views
0

В моем проекте meteor я пытаюсь получить объект метеора и перебирать его в html.Невозможно получить метеорный объект внутри html

Мой HTML код выглядит следующим образом:

<ul> 
    {{#each userTerritory myObject}} 
    <li class="">{{myObject.name}}</li> 
    {{/each}} 
    </ul> 

создал вспомогательный класс в client.js и я делаю вызов метода следующим образом для извлечения объекта из Монго дб

Template.dash_board_content1.helpers({ 

     'userTerritory': function(){ 

     Meteor.call('userTerritoryList',function(error,result){ 
      console.log(result); 
      if(!error){ 

      return result; 

        }else{ 
      alert("error : " + error); 
      } 

     }); 
     } 
    }); 

метод в server.js следующим образом:

in server.js 

'userTerritoryList': function(){ 
    console.log("testing"); 
    return Country.find().fetch();; 
} 
+0

Почему вы хотите, чтобы метод Meteor вызывал здесь вместо публикации/подписки? – zim

+0

@zim Использование методов считается лучшим подходом к обеспечению безопасности. Много раз было рекомендовано использовать методы и осуществлять проверки подлинности, ролей и т. Д. – Jankapunkt

+0

Я думаю, что вы думаете о методах Метеор против клиентской стороны. pub/sub является безопасным, а imho лучше подходит для вашей проблемы, чем вызов метода. – zim

ответ

0

Методы Метеор не работают с помощниками Blaze по умолчанию, заставить их работать вместе, вы можете использовать этот пакет: meteor-reactive-method

Template.dash_board_content1.helpers({ 
    userTerritory: function(){ 
    return ReactiveMethod.call('userTerritoryList'); 
    } 
}); 
0

Edit: а @zim указал, вы можете использовать вместо публикации и подписки функциональность метеора. Это будет лучшим решением для вашей описанной проблемы.

Читать далее: https://guide.meteor.com/data-loading.html

Если вы по-прежнему полагаться на использование вашего сервера на стороне вызова, вы можете использовать либо реактивный пакет метод, как @Khang указал. Если вы хотите иметь более зернистый доступ о ваших Итоговых значениях, вы должны использовать реактивную Dict:

import {Template} from 'meteor/templating'; 
import {ReactiveDict} from 'meteor/reactive-dict'; 

// create a new reactive dictionary to store reactive variables 
// let's call it state 
Template.dash_board_content1.onCreated(function onCreated(){ 

    //this refers to the Template.instance() here 
    this.state = new ReactiveDict(); 

    //initial value of userTerritoryList is null 
    //it will return nothing until it has been changed 
    this.state.set('userTerritoryList', null); 
    //you can even set an errors variable 
    this.state.set('errors', []); 
}); 

Затем вы можете получить доступ к реактивной Dict через Template.instance():

Template.dash_board_content1.helpers({ 

    'userTerritory': function(){ 
     const territoryList = Template.instance().state.get('userTerritoryList'); 

     if (territoryList) return territoryList; 

     Meteor.call('userTerritoryList', function(error,result){ 
      if(!error){ 
       Template.instance().state.set('userTerritoryList', result); 
      } else { 
       const errs = Template.instance().state.get('errors'); 
       errs.push(error); 
       //update errors 
       Template.instance().state.set('errors', errs); 
      } 
     }); 
    }, 

    'getErrors' : function() { 
     //use in your template to display multiple err messages 
     return Template.instance().state.get('errors'); 
    }, 
}); 

useTerritory хелпер использует Meteor.call только в том случае, если он не был установлен. Тем не менее, вы можете легко изменить метод, чтобы он всегда вызывал метод.

Обратите внимание, что вы можете тем самым реализовать более гранулированную обработку ошибок.

+0

Имхо-помощники не должны быть асинхронными. Лучше поместить вызов метода внутри автозапуска() в onCreated(), и пусть хелпер возвращает содержимое реактивного var. – zim

+0

Вы тоже можете это сделать. Я предпочитаю этот подход, чтобы мой автозапуск не становился слишком большим. Мне намного легче отлаживать, когда все коды с реактивной переменной находятся на месте. – Jankapunkt

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