can
Version: 
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
59 lines (49 loc) • 1.25 kB
HTML
<script type='text/stache' can-autorender id='demo-html'>
<p>Alison: <player-scores {scores}="game.scoresForPlayer('Alison')"/></p>
<p>Jeff: <player-scores {scores}="game.scoresForPlayer('Jeff')"/></p>
</script>
<script src="../../../node_modules/steal/steal.js" main="@empty" id='demo-source'>
import can from "can";
import "can/view/autorender/autorender";
import "can/view/bindings/bindings";
import "can/view/stache/stache";
import "can/map/define/";
can.Component.extend({
	tag: "player-scores",
	template: can.stache('{{#each scores}} {{points}} {{/each}} = {{scores.sum}}')
});
var ScoreList = can.List.extend({
	sum: function(){
		var sum = 0;
		this.each(function(score){
			sum += score.attr("points");
		});
		return sum;
	}
});
var Game = can.Map.extend({
	define: {
		scores: {
			Type: ScoreList
		}
	},
	scoresForPlayer: function(name){
		return this.attr("scores").filter(function(score){
			return score.attr("player") === name;
		});
	}
});
var game = new Game({
	scores: [
		{player: "Alison", points: 2},
		{player: "Alison", points: 3},
		{player: "Jeff", points: 5},
		{player: "Jeff", points: 1},
		{player: "Alison", points: 6},
		{player: "Jeff", points: 1},
	]
});
$("#demo-html").viewModel({
	game: game
});
</script>