<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>www.enriquelamastrujillo.com &#187; programación</title>
	<atom:link href="http://www.enriquelamastrujillo.com/blog/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.enriquelamastrujillo.com/blog</link>
	<description>Otro sitio creado con WordPress</description>
	<lastBuildDate>Fri, 27 Feb 2026 20:20:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Angularapp1 (9 de 9): category.html</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-9-de-9-category-html/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-9-de-9-category-html/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 16:02:43 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1161</guid>
		<description><![CDATA[Éste es el código completo:
>>>>>>>>
&#60;div&#62;
	&#60;form&#62;
	&#60;h1&#62;Items of Category {{currCategory.name}}&#60;/h1&#62;
	&#60;div ng-repeat=&#8221;item in currCategory.items&#8221; class=&#8221;item&#8221;&#62;
		&#60;!&#8211; no me gusta mucho como he resuelto el tema de mostar rellena esta parte cuando se navega por la app. &#8211;&#62;
		&#60;!&#8211; en el scope que puesto las variables auxiliares ckeckboxValues y selectValues &#8211;&#62;
		&#60;input type=&#8221;checkbox&#8221; ng-click=&#8221;updateOrder(item.id)&#8221; id=&#8221;checkbox-{{item.id}}&#8221; ng-model=&#8221;ckeckboxValues[item.id]&#8220;/&#62;
		&#60;select ng-change=&#8221;updateOrder(item.id)&#8221; id=&#8221;select-{{item.id}}&#8221; ng-model=&#8221;dummySelect&#8221;&#62;&#60;!&#8211; el ng-change me [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo:<br />
>>>>>>>><br />
&lt;div&gt;<br />
	&lt;form&gt;<br />
	&lt;h1&gt;Items of Category {{currCategory.name}}&lt;/h1&gt;<br />
	&lt;div ng-repeat=&#8221;item in currCategory.items&#8221; class=&#8221;item&#8221;&gt;<br />
		&lt;!&#8211; no me gusta mucho como he resuelto el tema de mostar rellena esta parte cuando se navega por la app. &#8211;&gt;<br />
		&lt;!&#8211; en el scope que puesto las variables auxiliares ckeckboxValues y selectValues &#8211;&gt;<br />
		&lt;input type=&#8221;checkbox&#8221; ng-click=&#8221;updateOrder(item.id)&#8221; id=&#8221;checkbox-{{item.id}}&#8221; ng-model=&#8221;ckeckboxValues[item.id]&#8220;/&gt;<br />
		&lt;select ng-change=&#8221;updateOrder(item.id)&#8221; id=&#8221;select-{{item.id}}&#8221; ng-model=&#8221;dummySelect&#8221;&gt;&lt;!&#8211; el ng-change me obliga a poner un ng-model. No uso ng-click para que no se ejecute solo con clickar en el desplegable &#8211;&gt;<br />
			&lt;option value=&#8221;1&#8243; ng-selected=&#8221;selectValues[item.id][1]&#8220;&gt;1&lt;/option&gt;<br />
			&lt;option value=&#8221;2&#8243; ng-selected=&#8221;selectValues[item.id][2]&#8220;&gt;2&lt;/option&gt;<br />
			&lt;option value=&#8221;3&#8243; ng-selected=&#8221;selectValues[item.id][3]&#8220;&gt;3&lt;/option&gt;<br />
		&lt;/select&gt;<br />
		{{item.price}}$<br />
		&lt;img ng-src=&#8221;img/items/{{item.image}}&#8221; width=&#8221;100&#8243; height=&#8221;100&#8243;/&gt; {{item.name}}<br />
	&lt;/div&gt;<br />
	&lt;div&gt;<br />
		&lt;button ng-disabled=&#8221;model.order.getNumberOfItems() < 1" ng-click="go('/summary')"&gt;Checkout&lt;/button&gt;<br />
	&lt;/div&gt;<br />
&lt;/div&gt;<br />
>>>>>>>></p>
<p>Las cosas a destacar de este archivo son:</p>
<p>&lt;input type=&#8221;checkbox&#8221; ng-click=&#8221;updateOrder(item.id)&#8221; id=&#8221;checkbox-{{item.id}}&#8221; ng-model=&#8221;ckeckboxValues[item.id]&#8220;/&gt;</p>
<p>Con ng-click hacemos que al modificar el checkbox se llame al updateOrder pasando el item id.</p>
<p>Este upddateOrder modifica el model y por tanto se actualiza el resumen del carrito, que en el html está así (en el index.html):</p>
<p>&lt;div&gt;Number of items: {{model.order.getNumberOfItems()}}&lt;/div&gt;<br />
&lt;div&gt;Total cost: {{model.order.getTotalCost()}}&lt;/div&gt;</p>
<p>Es un ejemplo de data binding. El html coje automáticamente los valores que devuelven esas dos funciones.</p>
<p>El id de checkbox-{{item.id}} lo pongo para luego poder acceder al checkbox con document.getElementById.</p>
<p>La parte más importante aquí es el ng-model=&#8221;ckeckboxValues[item.id]&#8220;. Esto es el two way data binding. Cuando el usuario marca/desmarca el checkbox, la variable ckeckboxValues[item.id] pasa a ser true/false. Y viceversa, si algún js modifica por programación la variable ckeckboxValues[item.id], el checkbox aparecería marcado o desmarcado en consecuencia, en tiempo real.</p>
<p>Esto evita al programador el código de tener que hacer todo esto &#8220;a mano&#8221;.<br />
ckeckboxValues es un array asociativo que relleno en el controller.</p>
<p>&lt;select ng-change=&#8221;updateOrder(item.id)&#8221; id=&#8221;select-{{item.id}}&#8221; ng-model=&#8221;dummySelect&#8221;&gt;<br />
&lt;option value=&#8221;1&#8243; ng-selected=&#8221;selectValues[item.id][1]&#8220;&gt;1&lt;/option&gt;</p>
<p>Aquí utilizo ng-change en lugar de ng-click porque el ng-click se ejecuta sólo con clickar en el desplegable y no quiero.</p>
<p>El uso de ng-change me ha obligado a poner un ng-model, el cual me ha valido apuntar a una variable tonta que he llamado dummySelect.</p>
<p>El uso de ng-selected hace que la opción esté seleccionada si la variable selectValues[item.id][1] es true. Es otro ejemplo de two way databinding.</p>
<p>Todo esto seguro que se puede hacer mejor pero como he dicho en artículos anteriores sólo he querido hacer un ejemplo básico.</p>
<p>&lt;button ng-disabled=&#8221;model.order.getNumberOfItems() < 1&#8243; ng-click=&#8221;go(&#8216;/summary&#8217;)&#8221;&gt;Checkout&lt;/button&gt;</p>
<p>El ng-disabled hace que el botón salga desactivado si no hay ningún elemento en el carrito. En cuanto el usuario selecciona un elemento sale activado y se vuelve a desactivar si el usuario quita todos los elementos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-9-de-9-category-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (8 de 9): category.js</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-8-de-9-category-js/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-8-de-9-category-js/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:57:10 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1158</guid>
		<description><![CDATA[Éste es el código completo
>>>>>>>
&#8216;use strict&#8217;;
myApp
.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/category/:categoryId', {
    templateUrl: 'category/category.html',
    controller: 'CategoryController'
  });
}])
.controller(&#8216;CategoryController&#8217;, ['$scope','$routeParams', '$http', function($scope, $routeParams, $http) {
	console.log("[CategoryController]&#8220;);
	var categoryId = $routeParams.categoryId;
	console.log(&#8220;[CategoryController]categoryId: &#8221; + categoryId);
	console.log(&#8220;[CategoryController]$scope.model: &#8220;);
	console.log($scope.model);
	var category = $scope.model.getCategory(categoryId);
	$scope.currCategory = category;//para poder pintar la categoria en el html
	//meto estas propiedades para poder pintar los checkboxes [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo<br />
>>>>>>><br />
&#8216;use strict&#8217;;</p>
<p>myApp<br />
.config(['$routeProvider', function($routeProvider) {<br />
  $routeProvider.when('/category/:categoryId', {<br />
    templateUrl: 'category/category.html',<br />
    controller: 'CategoryController'<br />
  });<br />
}])</p>
<p>.controller(&#8216;CategoryController&#8217;, ['$scope','$routeParams', '$http', function($scope, $routeParams, $http) {<br />
	console.log("[CategoryController]&#8220;);<br />
	var categoryId = $routeParams.categoryId;<br />
	console.log(&#8220;[CategoryController]categoryId: &#8221; + categoryId);<br />
	console.log(&#8220;[CategoryController]$scope.model: &#8220;);<br />
	console.log($scope.model);<br />
	var category = $scope.model.getCategory(categoryId);<br />
	$scope.currCategory = category;//para poder pintar la categoria en el html</p>
<p>	//meto estas propiedades para poder pintar los checkboxes como marcados cuando corresponde mientras navego por la app, ya que no se pude poner ng-model con funciones<br />
	//no me gusta mucho como he resuelto el tema de mostar rellena esta parte cuando se navega por la app.<br />
	$scope.initCheckboxValues = function() {<br />
		$scope.ckeckboxValues = new Array();<br />
		$scope.selectValues = new Array();<br />
		var item;<br />
		for(var i in category.items){<br />
			item = category.items[i];<br />
			var orderItem = $scope.model.order.getOrderItem(item.id);<br />
			$scope.ckeckboxValues[item.id] = (orderItem != null);<br />
			$scope.selectValues[item.id] = new Array();<br />
			var quantity;<br />
			if (orderItem != null) {<br />
				quantity = orderItem.quantity;<br />
			} else {<br />
				quantity = 1;<br />
			}<br />
			for (var i=1; i<=3; i++) {<br />
				$scope.selectValues[item.id][i] = (i == quantity);<br />
			}<br />
		}<br />
		console.log("[CategoryController]$scope.ckeckboxValues: ");<br />
		console.log($scope.ckeckboxValues);<br />
		console.log("[CategoryController]$scope.selectValues: ");<br />
		console.log($scope.selectValues);<br />
	}</p>
<p>	//meto los items en el modelo solo si no estaba ya. De esta manera si navego por la app no se hacen llamasas ajax innecesarias<br />
	if (category.items == null || category.items.length == 0) {<br />
		$http({<br />
		  method: 'GET',<br />
		  url: 'fake-ajax/get-items-' + categoryId + '.html'<br />
		}).then(function successCallback(response) {<br />
			console.log("[CategoryController] successCallback");<br />
			var item;<br />
			for(var i in response.data){<br />
				item = new Item();<br />
				item.parseFromObject(response.data[i]);<br />
				if(item != null){<br />
					category.items.push(item);<br />
				}<br />
				item = null;<br />
			}<br />
			$scope.initCheckboxValues();<br />
		  }, function errorCallback(response) {<br />
			console.log("[CategoryController] errorCallback");<br />
		  });<br />
	} else {<br />
		$scope.initCheckboxValues();<br />
	}</p>
<p>	//se le llama cuando el usuario modifica el carrito<br />
	$scope.updateOrder = function(itemId) {<br />
		console.log("[CategoryController - updateOrder] itemId: " + itemId);</p>
<p>		var checkbox = document.getElementById("checkbox-" + itemId);<br />
		var select = document.getElementById("select-" + itemId);</p>
<p>		var item = category.getItem(itemId);<br />
		if (checkbox.checked) {<br />
			$scope.model.order.addItem(item, Number(select.value));<br />
		} else {<br />
			$scope.model.order.removeItem(item);<br />
		}</p>
<p>		console.log("[CategoryController - updateOrder]$scope.model: ");<br />
		console.log($scope.model);<br />
	};<br />
}]);<br />
>>>>>>></p>
<p>En estas líneas</p>
<p>myApp<br />
.config(['$routeProvider', function($routeProvider) {<br />
  $routeProvider.when('/category/:categoryId', {<br />
    templateUrl: 'category/category.html',<br />
    controller: 'CategoryController'<br />
  });<br />
}])</p>
<p>Aparte de lo que ya comenté en el home.js, se ve que defino el parámetro categoryId el cual recojo luego en el contoller con</p>
<p>$routeParams.categoryId</p>
<p>Después en el contoller hago las siguientes cosas:</p>
<ul>
<li>Cojo la categoría del model y la pongo en el scope para poder &#8220;pintar el html&#8221;</li>
<li>Inicializo y relleno un par de arrays asociativos a partir del model y que me servirán para &#8220;pintar&#8221; los artículos tal y como los ha ido seleccionando el usuario para el carrito, es decir, si el usuario selecciona un artículo de la categoría roja, cuando</li>
<p> navego por la app y vuelvo a la categoría roja, pinto ese artículo como marcado y con el número de artículos que el usuario seleccionó. Esta parte seguro que se puede resolver mejor, pero como dije en la introducción sólo he pretendido hacer un punto de partida.</li>
<li>Me traigo la lista de artículos de la categoría y al igual que en el home, lo hago una única vez, para no hacer llamadas innecesarias al servidor.</li>
<li>Tengo el método updateOrder. A este método se le llama cada vez que el usuario modifica el carrito, ya lo veremos luego.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-8-de-9-category-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (7 de 9): home.html</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-7-de-9-home-html/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-7-de-9-home-html/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:53:37 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1155</guid>
		<description><![CDATA[Éste es el código completo:
>>>>>
&#60;div&#62;
	&#60;h1&#62;Home&#60;/h1&#62;
	&#60;div ng-repeat=&#8221;category in model.categories&#8221; class=&#8221;category&#8221;&#62;
		&#60;div&#62;
			&#60;a href=&#8221;#!/category/{{category.id}}&#8221;&#62;&#60;img ng-src=&#8221;img/categories/{{category.image}}&#8221; width=&#8221;100&#8243; height=&#8221;100&#8243;/&#62;&#60;/a&#62;
		&#60;/div&#62;
		&#60;div&#62;{{category.name}}&#60;/div&#62;
	&#60;/div&#62;
&#60;/div&#62;
>>>>>
Poco que comentar. Se ve cómo accede a los objetos del $scope, al cual tienen acceso mágicamente.
El uso de ng-src en lugar de src es porque con src el navegador daría not found al procesarlo e intentar ir a por esa imagen sin [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo:<br />
>>>>><br />
&lt;div&gt;<br />
	&lt;h1&gt;Home&lt;/h1&gt;<br />
	&lt;div ng-repeat=&#8221;category in model.categories&#8221; class=&#8221;category&#8221;&gt;<br />
		&lt;div&gt;<br />
			&lt;a href=&#8221;#!/category/{{category.id}}&#8221;&gt;&lt;img ng-src=&#8221;img/categories/{{category.image}}&#8221; width=&#8221;100&#8243; height=&#8221;100&#8243;/&gt;&lt;/a&gt;<br />
		&lt;/div&gt;<br />
		&lt;div&gt;{{category.name}}&lt;/div&gt;<br />
	&lt;/div&gt;<br />
&lt;/div&gt;<br />
>>>>></p>
<p>Poco que comentar. Se ve cómo accede a los objetos del $scope, al cual tienen acceso mágicamente.</p>
<p>El uso de ng-src en lugar de src es porque con src el navegador daría not found al procesarlo e intentar ir a por esa imagen sin que el angular haya hecho todavía el reemplazo de los {{}} por el correspondiente valor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-7-de-9-home-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (6 de 9): home.js</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-6-de-9-home-js/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-6-de-9-home-js/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:50:06 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1152</guid>
		<description><![CDATA[Éste es el código completo:
>>>>>>
&#8216;use strict&#8217;;
myApp
.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/home', {
    templateUrl: 'home/home.html',
    controller: 'HomeController'
  });
}])
.controller(&#8216;HomeController&#8217;, ['$scope', '$http', function($scope, $http) {
	console.log("[HomeController]&#8220;);
	console.log(&#8220;[HomeController]$scope.model: &#8220;);
	console.log($scope.model);
	//meto las categorias en el modelo solo si no estaba ya. De esta manera si navego por la app no se hacen llamasas ajax innecesarias
	if ($scope.model.categories == [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo:<br />
>>>>>><br />
&#8216;use strict&#8217;;</p>
<p>myApp<br />
.config(['$routeProvider', function($routeProvider) {<br />
  $routeProvider.when('/home', {<br />
    templateUrl: 'home/home.html',<br />
    controller: 'HomeController'<br />
  });<br />
}])</p>
<p>.controller(&#8216;HomeController&#8217;, ['$scope', '$http', function($scope, $http) {<br />
	console.log("[HomeController]&#8220;);<br />
	console.log(&#8220;[HomeController]$scope.model: &#8220;);<br />
	console.log($scope.model);<br />
	//meto las categorias en el modelo solo si no estaba ya. De esta manera si navego por la app no se hacen llamasas ajax innecesarias<br />
	if ($scope.model.categories == null || $scope.model.categories.length == 0) {<br />
		$http({<br />
		  method: &#8216;GET&#8217;,<br />
		  url: &#8216;fake-ajax/get-categories.html&#8217;<br />
		}).then(function successCallback(response) {<br />
			console.log(&#8220;[HomeController] successCallback&#8221;);<br />
			var category;<br />
			for(var i in response.data){<br />
				category = new Category();<br />
				category.parseFromObject(response.data[i]);<br />
				if(category != null){<br />
					$scope.model.categories.push(category);<br />
				}<br />
				category = null;<br />
			}</p>
<p>		  }, function errorCallback(response) {<br />
			console.log(&#8220;[HomeController] errorCallback&#8221;);<br />
		  });<br />
	}<br />
}]);<br />
>>>>>></p>
<p>Con las líneas</p>
<p>myApp<br />
.config(['$routeProvider', function($routeProvider) {<br />
  $routeProvider.when('/home', {<br />
    templateUrl: 'home/home.html',<br />
    controller: 'HomeController'<br />
  });<br />
}])</p>
<p>Se le está diciendo que cuando en la url estés en /home tiene que coger el contenido de home/home.html y el controlador de esta sección es el HomeController.</p>
<p>El HomeController se ejecuta cada vez que el usuario vaya a /home, tanto navegando por la app como con el botón de back del navegador.</p>
<p>Lo que hago en ese controller es traerme la lista de categorías y añadirlas al model. Y sólo lo hago una única vez, para no hacer llamadas ajax innecesarias. Las categorías no cambian, no hay necesidad de volver a consultar al servidor si ya me las he traído anteriormente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-6-de-9-home-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (5 de 9): app.js</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-5-de-9-app-js/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-5-de-9-app-js/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:46:49 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1149</guid>
		<description><![CDATA[Éste es el código completo:
>>>>>>
var myApp = angular.module(&#8216;angularapp1&#8242;, ['ngRoute']).
	config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) {
	  $locationProvider.hashPrefix('!');
	  $routeProvider.otherwise({redirectTo: '/home'});
	}]);
myApp.controller(&#8216;MyAppController&#8217;, ['$scope', '$location', function($scope, $location) {
	console.log("[MyAppController]&#8220;);
	$scope.model = new Model();//este objeto lo heredan el resto de controllers
	console.log(&#8220;[MyAppController]$scope.model: &#8221; + $scope.model);
	console.log($scope.model);
	$scope.go = function ( path ) {
	  $location.path( path );
	};
}]);
>>>>>>
Vemos que en la línea 
var myApp = angular.module(&#8216;angularapp1&#8242;, ['ngRoute']).
se [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo:<br />
>>>>>><br />
var myApp = angular.module(&#8216;angularapp1&#8242;, ['ngRoute']).</p>
<p>	config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) {<br />
	  $locationProvider.hashPrefix('!');</p>
<p>	  $routeProvider.otherwise({redirectTo: '/home'});<br />
	}]);</p>
<p>myApp.controller(&#8216;MyAppController&#8217;, ['$scope', '$location', function($scope, $location) {<br />
	console.log("[MyAppController]&#8220;);<br />
	$scope.model = new Model();//este objeto lo heredan el resto de controllers<br />
	console.log(&#8220;[MyAppController]$scope.model: &#8221; + $scope.model);<br />
	console.log($scope.model);</p>
<p>	$scope.go = function ( path ) {<br />
	  $location.path( path );<br />
	};<br />
}]);<br />
>>>>>></p>
<p>Vemos que en la línea </p>
<p>var myApp = angular.module(&#8216;angularapp1&#8242;, ['ngRoute']).</p>
<p>se hace referencia a lo que en el index.html se puso como ng-app.</p>
<p>Con la línea</p>
<p>$routeProvider.otherwise({redirectTo: &#8216;/home&#8217;});</p>
<p>Simplemente le decimos que al entrar en la aplicación vaya al /home. Veremos posteriormente que cada controlador de sección tendrá su propia instrucción para su ruta.</p>
<p>Vemos en la línea</p>
<p>myApp.controller(&#8216;MyAppController&#8217;, [&#8216;$scope&#8217;, &#8216;$location&#8217;, function($scope, $location) {</p>
<p>que se hace referencia al &#8216;MyAppController&#8217;, que en el index.hmtl se puso en el ng-controller.</p>
<p>Es el controlador general de la aplicación y lo único que hago en él es definir la función go que se usará en el botón de ir a la home, e inicializar el model de esta manera:</p>
<p>$scope.model = new Model();</p>
<p><b>Esto es lo más importante de todo. El único sitio donde creo un model es aquí y lo meto en el $scope.</b></p>
<p>El resto de controladores de sección que veremos luego accederán a este $scope.model puesto que heredarán del controlador principal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-5-de-9-app-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (4 de 9): index.html</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-4-de-9-index-html/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-4-de-9-index-html/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:43:10 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1145</guid>
		<description><![CDATA[Éste es el código completo
>>>>>
&#60;!doctype html&#62;
&#60;html ng-app=&#8221;angularapp1&#8243;&#62;
	&#60;head&#62;
		&#60;meta charset=&#8221;utf-8&#8243;&#62;
		&#60;title&#62;Test Angular&#60;/title&#62;
		&#60;link rel=&#8221;stylesheet&#8221; href=&#8221;css/styles.css&#8221; /&#62;
		&#60;script src=&#8221;https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-route.js&#8221;&#62;&#60;/script&#62;
		&#60;!&#8211; model &#8211;&#62;
		&#60;script src=&#8221;js/model/Item.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;js/model/Category.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;js/model/OrderItem.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;js/model/Order.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;js/model/Model.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;js/app.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;home/home.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;category/category.js&#8221;&#62;&#60;/script&#62;
		&#60;script src=&#8221;summary/summary.js&#8221;&#62;&#60;/script&#62;
	&#60;/head&#62;
	&#60;body ng-controller=&#8221;MyAppController&#8221;&#62;
		&#60;div&#62;Header&#60;/div&#62;
		&#60;button ng-click=&#8221;go(&#8216;/home&#8217;)&#8221;&#62;Home&#60;/button&#62;
		&#60;div&#62;Cart summary:&#60;/div&#62;
		&#60;div&#62;Number of items: {{model.order.getNumberOfItems()}}&#60;/div&#62;
		&#60;div&#62;Total cost: {{model.order.getTotalCost()}}&#60;/div&#62;
		&#60;div ng-view&#62;&#60;/div&#62;
		&#60;div&#62;Footer&#60;/div&#62;
	&#60;/body&#62;
&#60;/html&#62;
>>>>>
Se incluye tanto el js de angular como el módulo angular-route.js, que es independiente de angular y se necesita para hacer una [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es el código completo</p>
<p>>>>>><br />
&lt;!doctype html&gt;<br />
&lt;html ng-app=&#8221;angularapp1&#8243;&gt;<br />
	&lt;head&gt;<br />
		&lt;meta charset=&#8221;utf-8&#8243;&gt;<br />
		&lt;title&gt;Test Angular&lt;/title&gt;<br />
		&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;css/styles.css&#8221; /&gt;</p>
<p>		&lt;script src=&#8221;https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-route.js&#8221;&gt;&lt;/script&gt;</p>
<p>		&lt;!&#8211; model &#8211;&gt;<br />
		&lt;script src=&#8221;js/model/Item.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;js/model/Category.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;js/model/OrderItem.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;js/model/Order.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;js/model/Model.js&#8221;&gt;&lt;/script&gt;</p>
<p>		&lt;script src=&#8221;js/app.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;home/home.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;category/category.js&#8221;&gt;&lt;/script&gt;<br />
		&lt;script src=&#8221;summary/summary.js&#8221;&gt;&lt;/script&gt;</p>
<p>	&lt;/head&gt;<br />
	&lt;body ng-controller=&#8221;MyAppController&#8221;&gt;</p>
<p>		&lt;div&gt;Header&lt;/div&gt;<br />
		&lt;button ng-click=&#8221;go(&#8216;/home&#8217;)&#8221;&gt;Home&lt;/button&gt;<br />
		&lt;div&gt;Cart summary:&lt;/div&gt;<br />
		&lt;div&gt;Number of items: {{model.order.getNumberOfItems()}}&lt;/div&gt;<br />
		&lt;div&gt;Total cost: {{model.order.getTotalCost()}}&lt;/div&gt;</p>
<p>		&lt;div ng-view&gt;&lt;/div&gt;</p>
<p>		&lt;div&gt;Footer&lt;/div&gt;</p>
<p>	&lt;/body&gt;<br />
&lt;/html&gt;<br />
>>>>></p>
<p>Se incluye tanto el js de angular como el módulo angular-route.js, que es independiente de angular y se necesita para hacer una Single Page App con varias secciones.</p>
<p>Después incluyo cada objeto del model, el app.js y cada controlador.</p>
<p>En el html he añadido una especie de header, botón para ir a la home, resumen del carrito y footer, que aparecerá en todas las páginas o secciones.</p>
<p>Destaco en el html estas directivas:</p>
<p>&lt;html ng-app=&#8221;angularapp1&#8243;&gt;</p>
<p>Aquí decimos como que estoy en una app que se llamará angularapp1. Veremos posteriormente que a esto se hace referencia en el app.js</p>
<p>&lt;body ng-controller=&#8221;MyAppController&#8221;>&gt;</p>
<p>Aquí decimos que el controlador general de la app será el MyAppController. Veremos posteriormente que a esto se hace referencia en el app.js. </p>
<p>También veremos posteriormente que cada sección tendrá su propio controlador particular.</p>
<p>&lt;div ng-view>&lt;/div&gt;</p>
<p>Dentro de este div es donde AngularJs meterá el html de cada sección, el cual se traerá por ajax.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-4-de-9-index-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (3 de 9): Objetos del modelo</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-3-de-9-objetos-del-modelo/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-3-de-9-objetos-del-modelo/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:34:56 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1142</guid>
		<description><![CDATA[Considero que en el modelo de datos sólo debe de ir lo que se mandará al servidor y lo que se recupera de él. Cualquier objeto que se necesite para &#8220;pintar&#8221; la página o para otras cosas será parte del controlador, no del modelo.
De esta manera tengo los siguientes objetos:
Item:
Son los artículos de cada categoría. [...]]]></description>
			<content:encoded><![CDATA[<p>Considero que en el modelo de datos sólo debe de ir lo que se mandará al servidor y lo que se recupera de él. Cualquier objeto que se necesite para &#8220;pintar&#8221; la página o para otras cosas será parte del controlador, no del modelo.</p>
<p>De esta manera tengo los siguientes objetos:</p>
<p><b>Item:</b></p>
<p>Son los artículos de cada categoría. Un objeto simple con los atributos id, name, image y price.</p>
<p><b>Category:</b></p>
<p>Tiene los atributos id, name, image y un array de items.<br />
También tiene la función getItem que devuelve el item dado el itemId.</p>
<p><b>OrderItem:</b></p>
<p>Es cada elemento del carrito de la compra.<br />
Tiene como atributos un item de los vistos anteriormente y un quantity.</p>
<p><b>Order:</b></p>
<p>Es el propio carrito de la compra.<br />
El único atributo es un array de OrderItem y tiene una serie de métodos para añadir y eliminar del carrito, obtener el número de orderitems, el coste total y algún otro método necesario.</p>
<p><b>Model:</b></p>
<p>Es el objeto que representa el modelo de la aplicación. No lo he llamado App por no confundir con el app de AngularJs.<br />
Contiene un array de Category, un Order y el método getCategory para obtener una categoría dado su id.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-3-de-9-objetos-del-modelo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (2 de 9): Estructura de los archivos</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-2-de-9-estructura-de-los-archivos/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-2-de-9-estructura-de-los-archivos/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:31:53 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1139</guid>
		<description><![CDATA[El árbol de archivos y carpetas de la aplicación es la que se ve en la imagen.

La aplicación es un único html, el index.html, el cual incluye otras páginas o secciones, que en este caso son home.html, category.html y summary.hml.
Cada una de estas secciones va en su propia carpeta y tiene dos archivos, el html [...]]]></description>
			<content:encoded><![CDATA[<p>El árbol de archivos y carpetas de la aplicación es la que se ve en la imagen.</p>
<p><img src="http://static.enriquelamastrujillo.com/estructura-angularapp1.jpg" width="171" height="518"/></p>
<p>La aplicación es un único html, el index.html, el cual incluye otras páginas o secciones, que en este caso son home.html, category.html y summary.hml.</p>
<p>Cada una de estas secciones va en su propia carpeta y tiene dos archivos, el html de view y el js de controller.</p>
<p>En la carpeta css pongo un css muy básico.</p>
<p>En el fake-ajax pongo unos archivos a los que llamo por ajax para traerme del servidor las categorías y los artículos de cada categoría.</p>
<p>En la carpeta img van las imágenes de las categorías y sus artículos.</p>
<p>En la carpeta js hay una carpeta model y el app.js.</p>
<p>Dentro de la carpeta model hay un archivo por cada objeto del model. Me gusta hacer un archivo por cada objeto como se suele hacer en java y así el código está bien distribuido y fácil de encontrar.</p>
<p>El archivo app.js es el que tiene la inicialización de la aplicación.</p>
<p>Esta manera de distribuir los archivos me parece bastante limpia. Añadir nuevas páginas a la aplicación no es más que crear la carpeta y meter dentro el html de view y el js de controller e incluir este último en el index.html.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-2-de-9-estructura-de-los-archivos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Angularapp1 (1 de 9): Introducción</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-introduccion/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-introduccion/#comments</comments>
		<pubDate>Wed, 27 Jul 2016 15:20:44 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[angularjs]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1135</guid>
		<description><![CDATA[He hecho una app de ejemplo con AngularJs que pueda ser un punto de partida para cualquier aplicación SPA (Single Page App).
No trata de ser la biblia, ni de javascript ni de angular, sino un ejemplo básico, un punto de partida sin tirarme tres veranos.
La aplicación es un simple carrito de la compra. Al entrar, [...]]]></description>
			<content:encoded><![CDATA[<p>He hecho una app de ejemplo con AngularJs que pueda ser un punto de partida para cualquier aplicación SPA (Single Page App).<br />
No trata de ser la biblia, ni de javascript ni de angular, sino un ejemplo básico, un punto de partida sin tirarme tres veranos.<br />
La aplicación es un simple carrito de la compra. Al entrar, el usuario es redirigido a la home, la cual presenta las categorías obtenidas del servidor.<br />
Al pinchar en una categoría, el usuario accede a los artículos de esa categoría, también obtenidos del servidor, los cuales puede añadir al carrito.<br />
El usuario puede ver en todo momento un resumen del carrito, el cual se actualiza en tiempo real.<br />
Por último hay una página de resumen que simplemente saca el json de lo que sería el carrito que ha ido rellenando el usuario.<br />
El código de la aplicación lo podéis obtener en <a href="https://github.com/elamas/angularapp1" target="_blank">github</a> y podéis verla en funcionamiento <a href="http://static.enriquelamastrujillo.com/angularapp1/" target="_blank">aquí</a>.<br />
En futuros posts iré comentando el código.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/07/27/angularapp1-introduccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven: 07 &#8211; Trabajando en jares que no están en repositorios</title>
		<link>http://www.enriquelamastrujillo.com/blog/2016/06/02/maven-07-trabajando-en-jares-que-no-estan-en-repositorios/</link>
		<comments>http://www.enriquelamastrujillo.com/blog/2016/06/02/maven-07-trabajando-en-jares-que-no-estan-en-repositorios/#comments</comments>
		<pubDate>Thu, 02 Jun 2016 15:02:12 +0000</pubDate>
		<dc:creator>Quique</dc:creator>
				<category><![CDATA[informática]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://www.enriquelamastrujillo.com/blog/?p=1096</guid>
		<description><![CDATA[A veces se da el caso de que tienes un jar que no es tuyo y que no está en ningún repositorio. Lo que hay que hacer en este caso es instalarlo a mano por línea de comandos. Éste es el único caso que he encontrado necesario instalarse el maven, aunque incluso puede que se [...]]]></description>
			<content:encoded><![CDATA[<p>A veces se da el caso de que tienes un jar que no es tuyo y que no está en ningún repositorio. Lo que hay que hacer en este caso es instalarlo a mano por línea de comandos. Éste es el único caso que he encontrado necesario instalarse el maven, aunque incluso puede que se pueda hacer con el maven que trae el eclipse, no lo he probado.</p>
<p><b>Para instalar el jar en tu repositorio local:</b><br />
[maven-home]/mvn install:install-file -Dfile=XXXX -DgroupId=XXXX -DartifactId=XXXX -Dversion=XXXX -Dpackaging=jar<br />
Donde en Dfile hay que poner la ruta al jar.</p>
<p><b>Para instalar en el repositorio interno privado</b> (ver <a href="/blog/2016/05/20/maven-02-conceptos/">Maven: 02 – Conceptos</a>):<br />
[maven-home]/mvn deploy:deploy-file -Dfile=XXXX -DgroupId=XXXX -DartifactId=XXXX -Dversion=XXXX -Dpackaging=jar -DrepositoryId=release-repository -Durl=ftp://XXXX/maven-repository-release</p>
<p>Donde -DrepositoryId debe coincidir con el correspondiente en el C:\Users\pepe\.m2\settings.xml y -Durl debe ser la url del repositorio.</p>
<p>Para ejecutar este último comando me encontré con varios problemas para los cuales me fue difícil encontrar la solución porque no daba errores descriptivos.<br />
Tuve que copiar a mano estos dos jares:</p>
<ul>
<li>C:\Users\pepe\.m2\repository\org\apache\maven\wagon\wagon-ftp\2.10\wagon-ftp-2.10.jar a [maven-home]/lib</li>
<li>C:\Users\pepe\.m2\repository\commons-net\commons-net\3.1\commons-net-3.1.jar a [maven-home]/lib</li>
</ul>
<p>Si no tuvieras el commons-net-3.1.jar (u otras versiones supongo que valdrán) la tendrás que conseguir, yo la tenía porque la había usado como dependencia de algúnn proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.enriquelamastrujillo.com/blog/2016/06/02/maven-07-trabajando-en-jares-que-no-estan-en-repositorios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
