Perl, ASP, PHP, Apache, MySQL
NodeJs, Java, C#, MongoDB, Javascript, REST API
function paraCada(unArray, unaFuncion) {
for (i=0; i < unArray.length; i++) {
unaFuncion(unArray[i], i);
}
}
paraCada([10,20,'hola', 'que', 87], function(elem, index) {
console.log('Elemento:', elem, index)
});
function mapear(unArray, unaFuncion) {
var answer = [];
for (i=0; i < unArray.length; i++) {
answer.push(unaFuncion(unArray[i], i));
}
return answer;
}
function cuad(a) {
return a*a;
}
console.log(mapear([1,2,3,4,5], cuad));
var cuad, cubo, array = [1,2,3,4];
cuad = function(a){
return a * a;
};
cubo = function(a) {
return cuad(a) * a;
};
var array = [3,5,7,9,11,14];
array.map(cuad) + array.map(cubo);
console.log(array.reduce(0, suma));
array.filter(function (elem){ return elem > 10})
.map(function (elem) { return elem * elem });
function suma(a,b) {
return a + b;
}
function makeAdder(a) {
return function(b) {
return a + b;
};
}
var x = makeAdder(5);
var y = makeAdder(20);
x(6); // ?
y(7); // ?
var object = {name: 'Jon'};
object.lastName = 'Smith';
object.print = function(){
console.log('Name:', this.name);
console.log('LastName:', this.lastName)};
object.print();
{
"glossary":{
"title":"example glossary",
"GlossDiv":{
"title":"S",
"GlossList":{
"GlossEntry":{
"ID":"SGML",
"SortAs":"SGML",
"GlossTerm":"Standard Generalized Markup Language",
"Acronym":"SGML",
"Abbrev":"ISO 8879:1986",
"GlossDef":{
"para":"A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso":[
"GML",
"XML"
]
},
"GlossSee":"markup"
}
}
}
}
}
var padre = {nombre: 'Pepe', apellido: 'Perez'};
var hijo = Object.create(padre);
padre.mostrarNombre = function() { console.log(this.nombre)};
hijo.nombre = 'Pedro';
padre.mostrarNombre();
hijo.mostrarNombre();
console.log(hijo.apellido);
// Shape - superclass
function Shape() {
this.x = 0;
this.y = 0;
}
// superclass method
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
// Rectangle - subclass
function Rectangle() {
Shape.call(this); // call super constructor.
}
// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log('Is rect an instance of Rectangle?',
rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
rect instanceof Shape); // true
rect.move(1, 1); // Outputs, 'Shape moved.'
Crear una funcion buscar(array, criterio, siVacio), que reciba un array y dos funciiones si criterio es verdadero devolver el elemento encontrado sino doveolver el resultado de ejecutar la otra funcion "siVacio"
Completar el ejemplo de Shape para que incluya circulos y triangulos, un metodo para mostrar cada uno por consola y un metodo para escalar cada figura en un porcentaje
<div class="row">
<h2>Search movies</h2>
</div>
<div class="row">
<div class="col-xs-12">
<search-box autocomplete="searchVm.topMovieNames" search-callback="searchVm.updatedSearch"></search-box>
<movie-listing movies="searchVm.movies"></movie-listing>
</div>
</div>
<div class="row">
</div>
<home-footer></home-footer>
Cargar el script de angular, usar la directiva ng-app
<!doctype html>
<html ng-app>
<head>
<title>My Angular App</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
</head>
<body>
<!-- Add your template here -->
</body>
</html>
Es una funcion sin efectos secundarios que toma un valor del template o de otro filtro y lo reemplaza por otro.
Sintaxis:
{{expresion | filter1: param1 : param2 | filter2 : param21 | filter3 ...}}
Ordenar alfabeticamente los elementos del Todo List. Agregar un color de fondo gris a los elementos que estan completados del todo list.
MVC Model View Controller vs MVVM Model View ViewModel
Modificar el ejemplo en User List para:
Las directivas son marcadores en el DOM (elementos, atributos, classes o comentarios). Para extender el HTML, modificar el comportamiento de los elementos o de sus hijos.
Angular compila en tiepo de ejecucion los templates buscando directivas y agregando comportamiento a los elementos del DOM.
Api completa en https://docs.angularjs.org/api/ng/service/$compile
angular
.module('moviesApp')
.directive('searchBox', searchBoxDirective);
function searchBoxDirective() {
return {
restrict: 'E',
// template: '',
templateUrl: 'app/components/search-box/search-box.html',
scope: {
query: '=?',
autocomplete: '=',
searchCallback: '='
},
bindToController: true,
controller: 'SearchBoxController',
controllerAs: 'searchVm'
};
}
<div class="row">
<h2>Search movies</h2>
</div>
<div class="row">
<div class="col-xs-12">
<search-box autocomplete="searchVm.topMovieNames" search-callback="searchVm.updatedSearch"></search-box>
<movie-listing movies="searchVm.movies"></movie-listing>
</div>
</div>
<div class="row">
</div>
<home-footer></home-footer>
Las veremos mas adelante.
Modificar el ejemplo de la lista de usuarios para usar dos directivas, una para la lista, y otra para el formulario de entrada de los datos
Son objetos singleton no visuales con lazy initialization, que se pueden inyectar a traves del sistema de injeccion de dependencias en otros componentes.
Inversion de control, para configurar y testear
collection = new Array()
window.location = ‘http://www.google.com’
function factory(collectionClass){ collection = new collectionClass();}
// Reflection notation
angular.module('website').
controller('PageController', PageController);
function PageController($scope, $timeout){};
// $inject notation
angular.module('website').
controller('PageController', PageController);
PageController.$inject = [‘$scope’, ‘$timeout’];
function PageController($scope, $timeout){};
// Array notation
angular.module('website').
controller('PageController',
[‘$scope’, ‘$timeout’, function($scope, $timeout){}]
);
(function() {
angular
.module('webapp')
.factory('socialSharing', service);
service.$inject = [
'$window'
];
function service($window) {
var service = this;
service.shareWithNetwork = shareWithNetwork;
return service;
function shareWithNetwork(name, url, networkFun, label) {
if (!$window.plugins || !$window.plugins.socialsharing) {
return reportShareError(label);
}
$window.plugins.socialsharing[networkFun](name, null, url, angular.noop, function () {
reportShareError(label);
});
}
}
}
$http permite realizar llamadas http en sus diferentes metodos. devolviendo una promesa por el resultado de la llamada.
// Simple GET request example:
$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
$http.get('/someUrl', config).then(successCallback, errorCallback);
$http.post('/someUrl', data, config).then(successCallback, errorCallback);
Una promesa es un objeto que representa un valor que puede estar disponible ahora, en el futuro o nunca.
Trabajamos con promesas para computar valores de forma asincrona tomando acciones cuando el valor esta disponible o cuando se produce un error.
Una promesa puede tener tres estados, pendiente (pending), resuelto (resolved), rechazado(rejected).
Usando then(), catch(), finally() podemos tomar acciones ante los diferentes estados de la promesa.
function(aPromise, $q) {
aPromise
.then(successCallback, errorCallback)
.catch(errorCallback)
.finally(finallyCallback);
rejected = $q.reject();
resolved = $q.when();
newPromise = $q.all([rejected, resolved, aPromise]);
newPromise = $q.race([rejected, resolved, aPromise]);
//Create promises
deferred = $q.defer();
deferred.resolve(aValue);
deferred.reject(aValue);
return deferred.promise;
}
function anAsyncCall() {
var promise = doSomethingAsync();
promise.then(function() {
somethingComplicated();
});
return promise;
}
function anAsyncCall() {
var promise = doSomethingAsync();
return promise.then(function() {
somethingComplicated()
});
}
}
somethingAsync.then(
function() {
return somethingElseAsync();
},
function(err) {
handleMyError(err);
});
somethingAsync
.then(function() {
return somethingElseAsync();
})
.catch(function(err) {
handleMyError(err);
});
var promise;
if (asyncCallNeeded)
promise = doSomethingAsync();
else
promise = $q.when(42);
promise.then(function() {
doSomethingCool();
});
$q.when(asyncCallNeeded ? doSomethingAsync() : 42)
.then(function(value){
doSomethingGood();
})
.catch(function(err) {
handleTheError();
});
}
var deferred = $q.defer();
doSomethingAsync().then(function(res) {
res = manipulateMeInSomeWay(res);
deferred.resolve(res);
}, function(err) {
deferred.reject(err);
});
return deferred.promise;
return doSomethingAsync().then(function(res) {
return manipulateMeInSomeWay(res);
});
Crear un juego de ruleta virtual que permita sortear un numero, el numero, el color, y si es par o impar y la docena a la que pertenece. No hace falta mostrar el tablero.
los numeros aleatorios deben generarse usando la APi de random.org ver: Intro y Json rpc api con el metodo generateIntegers.
Numeros Negros: [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35]
Numeros Rojos: [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36]
APi Key: 2d87f134-9c82-4485-a79f-4d2e14129468
$stateProvider
.state('movie-page', {
title: 'Movie',
url: '/movie/:movieId',
templateUrl: 'app/pages/movie/movie-page.html',
controller: 'MoviePageController',
controllerAs: 'movieVm',
resolve: {
movie: ['$stateParams', 'moviesConnector',
function($stateParams, moviesConnector) {
var id = $stateParams.movieId;
return moviesConnector.movieInfo(id)
.then(function (response) {
return response.data;
});
}]
}
});
Agregar una pagina que muestre las peliculas que se estan viendo. en se pueden obtener los datos /api/movies/playing usando un resolve para obtener los datos.
el componente moviesConnector
tiene el metodo para recuperar los datos.
event.preventDefault()
para detener la transicionAgregando una clase que corresponde al estado se pueden acotar los css a cada pagina.
Interceptar eventos para proteger paginas.
$rootScope.$on('$stateChangeStart', function(e, to) {
if (!to.forceLogin) return;
if (!isLoggedIn($currentUser)) {
e.preventDefault();
// Optionally set option.notify to false if you don't want
// to retrigger another $stateChangeStart event
$state.go(result.to, result.params, {notify: false});
}
url
to all child state urls.template
con sus propiasui-view(s)
que los estados hijos van a completar.
resolve
.data
.onEnter
o onExit
que puedan modificar la app de alguna forma.Agregar en angular example: