流星:允许预定值进入集合

时间:2014-10-02 09:28:51

标签: javascript jquery validation meteor typeahead.js

在我的表单中,我创建了一个下拉列表,以便在用户输入时显示国家/地区列表。按照目前的情况,他们可以选择一个,单击“sublit”,然后通过流星调用将其插入到我的Posts集合中。以下代码以及此jQuery代码(保存在客户端文件夹中)是允许此功能运行的代码。使用的输入ID是“country。”

https://github.com/twitter/typeahead.js/blob/master/dist/typeahead.jquery.js

我的目标:允许将我的“country”变量中列出的国家/地区插入数据库。我希望在我的方法函数中验证这一点。

客户端:

Template.createpost.rendered = function() {
if (!this.rendered){
    var substringMatcher = function(strs) {
return function findMatches(q, cb) {
var matches, substrRegex;
matches = [];
substrRegex = new RegExp(q, 'i');
$.each(strs, function(i, str) {
  if (substrRegex.test(str)) {
    matches.push({ value: str });
  }
});
cb(matches);
};
};
var country = [
"Afghanistan",
    "Albania",
    "Algeria",
    "Andorra",
    "Angola",
    "Antigua and Barbuda",
    "Argentina",
    "Rest Of Countries"
];
$('#country').typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
name: 'country',
displayKey: 'value',
source: substringMatcher(country)
});
this.rendered = true;
} 
};


Template.createpost.events({
'submit form#createpost': function(e, tmpl) {
    e.preventDefault();
    var insertPostData = {
        country: $(e.target).find('#country').val()
    }
    Meteor.call('insertPostData', insertPostData, function(error, id){
        if (error) {
            alert(error.reason);
        }
    });
}

});

SERVER:我的方法到目前为止仅在用户未选择国家/地区时才会引发错误。我不确定检查从客户端收到的国家/地区值的语法与我希望在我的方法中列出的值数组我愿意接受其他建议以实现此目的,请告诉我。谢谢你们。

Meteor.methods({
'insertPostData': function(insertPostData){
  if (!insertPostData.country) 
    throw new Meteor.Error(422, 'please select valid country');
  return insertPostData._id = AllPosts.insert(insertPostData);

}});

2 个答案:

答案 0 :(得分:0)

我将继续这样做:首先,在您应用的共享文件夹中声明您的countries数组,以便它可以在两种环境中使用。

lib/constants.js

countries=[...];

然后使用此数组构建您的预先输入客户端,并检查发送到该方法的国家/地区的有效性。

if (!insertPostData.country || !_.contains(countries,insertPostData.country)){
  throw new Meteor.Error(422, 'please select valid country');
}

我们为此目的使用_.contains。

http://underscorejs.org/#contains

答案 1 :(得分:0)

如果它只是针对数组检查值,我只是在数组上使用filter方法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

var countries = [
"Afghanistan",
    "Albania",
    "Algeria",
    "Andorra",
    "Angola",
    "Antigua and Barbuda",
    "Argentina",
    "Rest Of Countries"
];

var insertPostData = {};

insertPostData.country = "Albania";

if(countries.filter(function(country){ return insertPostData.country === country; }).length > 0) 
    {
        console.log("country listed");
    } else {
        console.log('country not listed');
    }

此过滤器函数在您的数组中运行并根据您提供的过滤器创建一个新数组,如果返回为true则添加它,如果不是,则跳过它。因此,如果长度为0,那么它没有找到任何匹配该值的国家/地区。

或者Meteor附带下划线库,您可以执行以下操作:

Meteor.methods({
  'insertPostData': function(insertPostData){
    if (!insertPostData.country ||  _.contains(countries, insertPostData.country);) 
      throw new Meteor.Error(422, 'please select valid country');
    return insertPostData._id = AllPosts.insert(insertPostData);
} });

其次,将数组添加到客户端和服务器可以在libs/countries.js

之类的地方看到的位置

并添加不带var关键字的数组,因此不限于该文件:

countries = [
    "Afghanistan",
    "Albania",
    "Algeria",
    "Andorra",
    "Angola",
    "Antigua and Barbuda",
    "Argentina",
    "Rest Of Countries"
];