This is a simple dice rolling application built as part of an ember.js tutorial by William Hart. See the tutorial at http://www.williamhart.info/an-emberjs-beginners-tutorial.html.
This software is free to use and released in the public domain.
This is a simple dice rolling application built as part of an ember.js tutorial by William Hart. See the tutorial at http://www.williamhart.info/an-emberjs-beginners-tutorial.html.
This software is free to use and released in the public domain.
var Roller = Ember.Application.create({ | |
LOG_TRANSITIONS: true, | |
LOG_BINDINGS: true, | |
LOG_VIEW_LOOKUPS: true, | |
LOG_STACKTRACE_ON_DEPRECATION: true, | |
LOG_VERSION: true, | |
debugMode: true | |
}); | |
Roller.Roll = Ember.Object.extend({ | |
diceNumber: 0, | |
totalRolls: 0, | |
numberOfRolls: 0, | |
proportion: function() { | |
var width = 20 + parseInt(400 * this.get("numberOfRolls") / | |
this.get("totalRolls")); | |
return "width: " + width + "px;"; | |
}.property("totalRolls", "numberOfRolls") | |
}); | |
Roller.Router.map(function () { | |
this.resource("roll"); | |
}); | |
Roller.IndexRoute = Ember.Route.extend({ | |
redirect: function () { | |
this.transitionTo("roll"); | |
} | |
}); | |
Roller.RollRoute = Ember.Route.extend({ | |
model: function () { | |
// in a data driven application this could be used | |
// to get information from a server. Here we just | |
// declare an empty array in memory | |
return []; | |
}, | |
setupController: function(controller, model) { | |
controller.set("content", model); | |
} | |
}); | |
Roller.RollController = Ember.Controller.extend({ | |
rollDice: function () { | |
var roll = this.get("rollString"), | |
content = [], | |
rolls = 0, | |
sides = 0, | |
errors = "", | |
i, rnd, roll_parts; | |
// check if anything was provided | |
if (roll === undefined) { | |
this.set("errors", "Please fill out the text box!"); | |
return | |
} | |
// split up the string around the 'd' | |
roll_parts = roll.split("d"); | |
if (roll_parts.length !== 2) { | |
// check if we had a "d" in our text (i.e. its correctly formatted) | |
errors += "You need to enter a value in the format 'xdy'. "; | |
} else { | |
// then split up and parse the required numbers | |
rolls = parseInt(roll_parts[0]); | |
sides = parseInt(roll_parts[1]); | |
if (isNaN(rolls) || isNaN(sides)) { | |
errors += "Rolls and sides must be numbers. "; | |
} | |
// generate the dice rolls if we haven't found any errors | |
if (errors.length === 0) { | |
// generate all the models | |
for (i = 0; i < sides; i++) { | |
content.push(Roller.Roll.create({ | |
diceNumber: i + 1, | |
totalRolls: rolls | |
})); | |
} | |
// now roll all the dice | |
for (i = 0; i < rolls; i++) { | |
// roll a dice | |
rnd = Math.floor(Math.random() * sides); | |
// increment the required model | |
content[rnd].incrementProperty("numberOfRolls"); | |
} | |
} | |
} | |
// update the content | |
this.set("content", content); | |
// display any errors | |
this.set("errors", errors); | |
} | |
}); | |
Roller.DiceInputField = Ember.TextField.extend({ | |
keyDown: function (event) { | |
var controller, action; | |
// check if we pressed the enter key | |
if (event.keyCode !== 13) { | |
return; | |
} | |
// call the controllers 'rollDice' function | |
controller = this.get("controller"); | |
action = this.get("action"); | |
controller.send(action, this.get("rollString"), this); | |
} | |
}); |
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>An ember dice roller</title> | |
<link rel="stylesheet" type="text/css" href="styles.css"> | |
</head> | |
<body> | |
<script type="text/x-handlebars" id="application"> | |
<h1>Dice Roller</h1> | |
{{outlet}} | |
</script> | |
<script type="text/x-handlebars" id="index"> | |
<p> | |
{{#linkTo "roll"}}Start rolling dice!{{/linkTo}} | |
</p> | |
</script> | |
<script type="text/x-handlebars" id="roll"> | |
<p> | |
Enter your required dice roll below, for instance "3d6" will roll three six sided dice. | |
</p> | |
{{view Roller.DiceInputField valueBinding="rollString" action="rollDice" placeholder="Enter your dice roll, e.g. '3d6' here"}} | |
<button {{action "rollDice"}}>Roll Dice</button> | |
{{#if errors}} | |
<div class="errors"> | |
{{errors}} | |
</div> | |
{{/if}} | |
<hr> | |
<h2>Results</h2> | |
{{#each roll in content}} | |
<div class="roll"> | |
<span class="roll-number">{{roll.diceNumber}}</span> | |
<span class="roll-result" {{bindAttr style="roll.proportion"}}>{{roll.numberOfRolls}}</span> | |
</div> | |
{{else}} | |
No results yet | |
{{/each}} | |
</script> | |
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.js"></script> | |
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0/handlebars.js"></script> | |
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/ember.js/1.0.0/ember.prod.js"></script> | |
<script type="text/javascript" src="app.js"></script> | |
</body> | |
</html> |
.errors { | |
margin: 2em; | |
padding: 1em; | |
border: 1px solid #A22; | |
color: #A22; | |
background: #FDD; | |
} | |
.roll-result, .roll-number { | |
display: inline-block; | |
margin: 0.2em; | |
padding: 0.5em; | |
} | |
.roll-number { | |
font-weight: bolder; | |
min-width: 50px; | |
} | |
.roll-result { | |
background: #03C; | |
color: white; | |
text-align: right; | |
} | |
input, button { | |
padding: 0.5em; | |
font-size: 1.1em; | |
border: none; | |
outline: none; | |
} | |
input { | |
background: #EEE; | |
min-width: 350px; | |
} | |
button { | |
cursor:pointer; | |
background: #03C; | |
color: white; | |
} |