2017-02-14 12 views
0

在我的流星项目中,我试图获得一个流星对象并在html中进行迭代。无法接收html内的流星对象

我的HTML代码如下:

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

在client.js创建一个辅助类和我做的方法调用如下从蒙戈DB

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

我想你正在考虑Meteor方法vs客户端写入。 pub/sub是安全的,imho比方法调用更适合您的问题。 – zim

回答

0

流星方法在默认情况下不适用于Blaze的助手,让他们一起工作,你可以使用这个包:meteor-reactive-method

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

编辑:作为@zim指出的那样,你可能会喜欢使用流星的发布和订阅功能。这将是您描述的问题的最佳解决方案。

阅读资料上:https://guide.meteor.com/data-loading.html

如果仍然依赖于使用你的服务器端调用,您可以使用该方法反应包,@Khang指出。如果你想对自己的结果数值更细粒度的访问,你应该使用一个反应字典:

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', []); 
}); 

然后你就可以通过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

imho助手不应该是异步的。最好将方法调用放在onCreated()的autorun()中,并让帮助程序返回无功变量的内容。 – zim

+0

你也可以这样做。我更喜欢这种方法来防止自动运行过大。当所有无功变量相关代码就位时,它使我更容易进行调试。 – Jankapunkt