You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.7 KiB

## Lesson Objectives
1. Completed `angular_delete.md`
1. change css with angular
1. simple update with double click
1. Make form make AJAX request on double click
## Changing css with angular
### Toggling a true/false value
We will want to change the appearance of the holidays we've celebrated and store this data in our database. Our Holiday object has a `celebrated` property that can be either true or false.
Let's make a new function `this.updateCelebrated` in our `app.js`
**In `js/app.js`**
```js
this.updateCelebrated = holiday => {
console.log ("Let's celebrate", holiday.name, 'Day!')
}
```
**In `index.html`**
```html
<tr ng-repeat="holiday in ctrl.holidays">
<td ng-dblclick="ctrl.updateCelebrated( holiday )"> {{ holiday.name }} Day</td>
<td ng-click="ctrl.deleteHoliday( holiday._id )">x</td>
</tr>
```
So, now when we double click our holiday name, we should get a `console.log`
![Succes in console.logging](https://i.imgur.com/ex6sI7A.png)
Let's create some toggle functionality
**In `js/app.js`**
```js
this.updateCelebrated = holiday => {
console.log("Let's celebrate", holiday.name, 'Day!')
holiday.celebrated = !holiday.celebrated
console.log(holiday.celebrated)
}
```
Now, every time we double click our holiday name, the `celebrated` property toggles between true and false
![true false toggle](https://i.imgur.com/Z7J9lWL.png)
### Using our true/false value to set a css class
We can base the css class on a boolean property we have in our holiday object. We have a property called `celebrated`, which by default, is false, but we can build in functionality to make it toggle between true and false.
We'll use a ternary operator. This fancy term is just a way to write a short-hand if-else statement.
A ternary operator is made up of 5 components
1. The statement to be evaluated. This statement will be evaluated if it is [truthy or falsey.](https://www.sitepoint.com/javascript-truthy-falsy/)
2. a question mark `?`
3. what happens if the statement is `truthy`
4. a `:` to separate the truthy evaluation from the falsey one
5. what happens if the statement is `falsey`
So if we have
```
(true) ? 'hooray' : 'boo'
```
This will evaluate to 'hooray'
or
```
(false) ? 'hooray' : 'boo'
```
This will evaluate to 'boo'
So, we can now dive into our `index.html` and change the `css` property based on the `celebrated` boolean value.
**In `index.html`**
```html
<tr ng-repeat="holiday in ctrl.holidays">
<td ng-dblclick="ctrl.updateCelebrated( holiday )"
ng-class="(holiday.celebrated ? 'celebrated' : '' )"
> {{ holiday.name }} Day</td>
<td ng-click="ctrl.deleteHoliday( holiday._id )">x</td>
</tr>
```
Now, when we refresh the page, we can double click on each holiday name and change its CSS every time, based on the `celebrated` value
### Updating our new `celebrated` value in our database
Every time we refresh our page, we lose our info of whether or not we celebrated our holiday.
We can use an `$http` call to update our database
**In `js/app.js`**
```js
this.updateCelebrated = holiday => {
holiday.celebrated = !holiday.celebrated
$http({
method: 'PUT',
url: '/holidays/' + holiday._id,
data: { celebrated: holiday.celebrated }
}).then(response => {
console.log(response.data.celebrated)
}, error => {
console.log(error.message)
})
}
```
Cool! Now we can update our database and when we reload our page it remembers if we have celebrated the holiday
## Take Aways
- Being able to manipulate css with angular adds an exciting level of interactivity
- Ternary operators are a neat way to keep our code short
- Update requires a couple extra steps, but when we make a plan and take it step by step it is not so bad
## Onwards
[Angular Show One Holiday](angular_show.md)