流星:“无法读取属性'xxx'未定义”&用变量替换字符串

时间:2013-08-27 21:16:37

标签: javascript mongodb meteor

我想使用变量而不是字符串“score20130901”但是如果我用以下代码替换字符串,我有时会(经常)得到这个错误: “未捕获的TypeError:无法读取未定义的属性'currentflag'”

我在同一个JavaScript文件中的其他模板中使用此方法并且它可以正常工作。但不是在这个模板中。我想,页面加载太慢或者集合没有完全加载。

新JavaScript(此处我想用测试替换score20130901)

Template.voting.books = function () {
    var flag = Flags.findOne({_id: "bookflag"});
    test = flag && flag.currentflag;
    //alert(test);

    var books = Books.find({flag: "score20130901"}).fetch();
    return _.sortBy(books, function (book) {
        return _.reduceRight(book.score20130901, function (memo, num) {
            return memo + num;
        });
    }).reverse();
}; 

数据库

Flags.insert({
_id: "bookflag",
currentflag: "score20130901"
});


另一个问题是,我正在拼命用变量替换相同的字符串,如果字符串有一个带[i]的数组:

JavaScript的:

Template.book.totalscore = function () {
    var flag = Flags.findOne({_id: "bookflag"});
    test = flag.currentflag;

    var total = 0;
    for (var i=0; i<5; i++) {
        total += this.test[i];
    }
    return total;
};  

2 个答案:

答案 0 :(得分:2)

试试这个:

Template.voting.books = function () { 
    var flag = Flags.findOne({_id: "bookflag"}); 

    if (typeof flag !== 'undefined') { 
        var books = Books.find({flag: flag.currentflag}).fetch(); 
        return _.sortBy(books, function (book) { 
            return _.reduce(book[flag.currentflag], function (memo, num) { 
                return memo + num; 
            }); 
        }).reverse(); 
    }
    else return []; 
};

对于第二部分,这个:

Template.book.totalscore = function () {
    var flag = Flags.findOne({_id: "bookflag"});

    if (typeof flag !== 'undefined') { 
        return _.reduce(this[flag.currentflag], function (memo, num) { 
            return memo + num; 
        });
    }
    else return 0;
}; 

答案 1 :(得分:0)

你可能是对的!您的连接可能还没有完全让您的数据库下载。因此它不会有任何结果。

您需要做的只是处理案例flagnull

Template.voting.books = function () {
    var flag = Flags.findOne({_id: "bookflag"});


    test = flag && flag.currentflag;
    return Books.find({flag: test}, {sort: {totalscore: -1, _id: 1}});
}; 

第二种情况:

Template.book.totalscore = function () {
var flag = Flags.findOne({_id: "bookflag"});
test = flag && flag.currentflag;
var total = 0;

if(test) {
    for (var i=0; i<5; i++) {
        total += this.test[i];
    }
}
return total;

};