2016-07-14 7 views
0

を呼び出す関数の値をレンダリングしませんMustacheJSは、私は、単純なMustacheJSテンプレートを持っている他の機能

var data = { 
    votes: { 
    total: function() { 
     return this.voters.men.length + this.voters.women.length + this.voters.unknown.length; 
     //return this.votes.men() + this.votes.women() + this.votes.unknown(); 
    }, 
    men: function() { 
     return this.voters.men.length; 
    }, 
    women: function() { 
     return this.voters.women.length; 
    }, 
    unknown: function() { 
     return this.voters.unknown.length; 
    } 
    }, 
    voters: { 
    men: [ 
     "hpiotrekh", 
     "goferek", 
     "Carlos_Irwin_Estevez", 
     "Nemezis_" 
    ], 
    women: [], 
    unknown: [ 
     "komurczak", 
     "PLDami" 
    ] 
    } 
} 

var template = $('#myTpl').html(); 
var html = Mustache.to_html(template, data); 
$('#container').html(html); 

における場合ときに、第2のreturn文でvotes.total関数はコメントされており、関数のすべての関数が最初に返されます。しかし、それが所属するオブジェクトの関数を使用する2番目のreturnステートメントを使用しようとすると、コードはレンダリングされません。

理由を理解できません。

ライブデモhttps://jsfiddle.net/bxgnd7ch/

ただ、第四行とコメント解除5日コメント。

答えて

1
関数コンテキストによって引き起こされるこのエラーが変更

、実際の問題は、あなたが合計()関数では、呼び出し元this.votes

によって目的関数を呼び出しているということである

this.voters.men.length + this.voters.women.length + this.voters.unknown.length; 

コンテキストthisdata

を指しています

問題は次のとおりです。

return this.votes.men() + this.votes.women() + this.votes.unknown() 

は、発信者this.votesthis.votes.men()を呼び出し、コンテキストthisはそうdata.votes 男性/女性/未知の機能

this === data.votes 

ザッツのコンテキストを指しているのはなぜ男性は()関数は、アクセスしようとすると

this.voters.men.length 

その実際

data.votes.voters.men.lengthにアクセスしていますがにアクセスすることが期待

です。このため、エラーが発生します。

ソリューション:

すると、あなたが本当にオブジェクト関数

の内部でオブジェクトの関数を呼び出す必要がある場合、それはこのようになりますdataオブジェクト、 のうち、votersを抽出するようにしてください: https://jsfiddle.net/bxgnd7ch/3/

+0

ことがあります少し複雑ですが、私はそれをゆっくり理解しています。上記のコードはテンプレートの一部です。テンプレートに渡すオブジェクト投票者も必要です。だから私はそれをデータオブジェクトから除外することはできません。それとももっと洗練された方法がありますか? – mrJoe

+0

また、total関数でthis.votes.men.call(this)を使用してコンテキストを 'data'とバインドすることができます デモ: https://jsfiddle.net/bxgnd7ch/4/ –

+0

これは良い方法です。 'votes'オブジェクト内で 'this'を呼び出すことは、 'data'オブジェクトをオーバーライドすることを意味するのは奇妙なことではありませんか? – mrJoe

関連する問題