{"id":2372,"date":"2016-08-17T14:59:45","date_gmt":"2016-08-17T14:59:45","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2372"},"modified":"2023-09-11T00:43:22","modified_gmt":"2023-09-11T07:43:22","slug":"learning-angular2-for-the-cean-stack","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/learning-angular2-for-the-cean-stack\/","title":{"rendered":"Aprendizaje de Angular2 para la pila CEAN"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>La pila CEAN (pronunciado \"keen\") se utiliza para dise\u00f1ar aplicaciones web con una interfaz de usuario segregada (es como la pila MEAN, excepto que utiliza <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Servidor Couchbase<\/a>).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Estoy aprendiendo y escribiendo Angular2 por primera vez este mes, as\u00ed que pens\u00e9 en tomarme un momento para bloguear sobre lo que he aprendido. Si ves algo que estoy haciendo mal o de manera sub\u00f3ptima, ahora es tu oportunidad de darme tu opini\u00f3n y ayudarme a aprender. Puedes dejar un comentario o <a href=\"https:\/\/twitter.com\/mgroves\">env\u00edame un tweet<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Algunos antecedentes r\u00e1pidos: Nunca he usado ninguno de estos modernos frameworks de interfaz de usuario en ning\u00fan c\u00f3digo de producci\u00f3n (todav\u00eda). Esto incluye Angular, Angular2, Ember, React, etc. De donde vengo, todo estaba en JavaScript\/jQuery\/jQuery UI.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"truetypescript-code-behind\">C\u00f3digo TypeScript<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>No tienes que usar TypeScript para usar Angular2, pero mi compa\u00f1ero de trabajo Nic Raboy lo ha estado usando por un tiempo, y eso es lo que me ha estado guiando a usar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>TypeScript es un superconjunto de JavaScript (piensa en \u00e9l como JavaScript++) que se transpila a JavaScript plano. En Angular2, una p\u00e1gina (o vista) est\u00e1 acoplada a un archivo TypeScript (ts) (viniendo de un fondo ASP.NET, pienso en estos como \"archivos de c\u00f3digo detr\u00e1s\"). El archivo TS es responsable de cargar los datos que la vista puede utilizar, as\u00ed como de responder a los eventos de la vista.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Un ejemplo muy sencillo de un archivo TS que carga empresas desde un punto final REST y las pone a disposici\u00f3n de la vista para su uso:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlightjs highlight\"><code class=\"language-JS\">import { Component } from '@angular\/core';\r\nimport { ICompany } from '..\/..\/entityInterfaces.ts';\r\n\r\n@Component({\r\n  selector: 'companies',\r\n  templateUrl: '.\/app\/components\/companies\/companies.html'\r\n})\r\n\r\nexport class CompaniesComponent {\r\n\r\n    public companies : Array;\r\n\r\n    public constructor() {\r\n        this.loadCompanies();\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>En este ejemplo, he \"importado\" (esto es como un \"using\" en C#) un tipo de interfaz llamado ICompany. As\u00ed es, en TypeScript puedes declarar tipos de una forma mucho m\u00e1s expl\u00edcita que en JavaScript plano. El <code><code>plantillaUrl<\/code><\/code> en el <code>@Componente<\/code><\/code> le dice a este fichero TS a qu\u00e9 fichero HTML corresponde. Por \u00faltimo, estoy creando una clase con un constructor y un campo llamado <code><code>empresas<\/code><\/code>. El constructor llama a un m\u00e9todo para cargar esas empresas (desde un punto final REST usando Ajax). En este punto, <code><code>empresas<\/code><\/code> est\u00e1 disponible para que el archivo HTML haga referencia.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"trueangular2-view\">Vista Angular2<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Una vista HTML en Angular2 es principalmente HTML, pero yo pienso en ella como una plantilla. Dentro de esta plantilla, utilizo varias etiquetas y sintaxis espec\u00edficas de Angular2 para renderizar algo din\u00e1micamente.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por ejemplo, ahora que tengo el <code><code>empresas<\/code><\/code> array, puedo generar una tabla para listar todas las empresas.<\/p>\n<pre class=\"lang:default decode:true\">&lt;table&gt;\r\n    &lt;tr&gt;&lt;th&gt;Nombre&lt;\/th&gt;&lt;\/tr&gt;\r\n    &lt;tr *ngfor=&quot;let company of companies;&quot;&gt;\r\n        &lt;td&gt;{{company.companyName}}&lt;\/td&gt;\r\n        &lt;td&gt;\r\n            &lt;a href=&quot;#&quot; (click)=&quot;delete(company.id)&quot;&gt;Borrar&lt;\/a&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/td&gt;\r\n    &lt;\/tr&gt;\r\n&lt;\/table&gt;<\/pre>\n<p>La mayor parte es HTML que no deber\u00edas tener problemas para leer.<\/p>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Lo primero que no es HTML normal es el bot\u00f3n <code>*ngPor<\/code><\/code> con un bucle especificado: <code>dejar empresa de empresas<\/code><\/code>. Pienso en esto como <code>foreach(var company in companies)<\/code><\/code> en t\u00e9rminos de C#. Dado que el <code>ngPor<\/code><\/code> est\u00e1 en el<span style=\"font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace\"><span style=\"font-size: 15px\">\u00a0&lt;tr&gt;\u00a0<\/span><\/span>ese elemento (y sus hijos) se repetir&aacute; una vez por cada empresa de la matriz. As&iacute;, si hay 3 empresas, habr&aacute; tres &lt;tr&gt; filas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Lo siguiente fuera de lo com\u00fan es el <code>{{company.companyName}}<\/code><\/code>. Si ha utilizado <a href=\"https:\/\/mustache.github.io\/\">Bigote<\/a> u otras plantillas del lado del cliente, esto deber\u00eda resultarle familiar. Se trata simplemente de interpolar el valor de la variable <code>nombre de la empresa<\/code><\/code> en el HTML. As\u00ed, si el primer <code>empresa.nombreempresa<\/code><\/code> tiene el valor \"Couchbase\", la salida ser\u00e1<span style=\"font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace\"><span style=\"font-size: 15px\"> &lt;td&gt;Couchbase&lt;\/td&gt;.<\/span><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por \u00faltimo, he creado un enlace \"eliminar\" en cada fila. Lo que es fuera de lo com\u00fan all\u00ed es el <code>(clic)<\/code><\/code> atributo. Esto le dice a Angular que ejecute alg\u00fan TypeScript cuando se haga clic en el enlace de borrado. En este caso, es el atributo <code>borrar<\/code><\/code> en el c\u00f3digo TS. Est\u00e1 pasando un par\u00e1metro a ese m\u00e9todo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Con el m\u00e9todo de borrado, el c\u00f3digo ser\u00eda el siguiente:<\/p>\n<\/div>\n<pre class=\"lang:default decode:true\">import { Component } from '@angular\/core';\r\nimport { ICompany } from '..\/..\/entityInterfaces.ts';\r\n@Component({ \r\n  selector: 'companies',\r\n  templateUrl: '.\/app\/components\/companies\/companies.html'\r\n})\r\n\r\nexport class CompaniesComponent {\r\n  public companies : Array; \r\n  public constructor() {\r\n    this.loadCompanies();\r\n  }\r\n  public delete(id: string) {\r\n    console.log(\"Deleting Company: \" + id) \r\n    this.deleteCompany(id); \r\n    \/\/ delete from the companies array\r\n    for(let i=0; i &lt; this.companies.length; i++) {\r\n      if(this.companies[i].id == id) {\r\n        this.companies.splice(i, 1);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"paragraph\">\n<p>Obs\u00e9rvese que el <code>borrar<\/code><\/code> tiene un par\u00e1metro, y como esto es TypeScript, es un par\u00e1metro <em>mecanografiado<\/em> par\u00e1metro.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hay tres cosas que hago en ese m\u00e9todo de borrado:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>Escribir un mensaje en la consola (para depuraci\u00f3n\/ilustraci\u00f3n)<\/li>\n<li>Llamar a un m\u00e9todo que enviar\u00e1 una petici\u00f3n POST o DELETE a un endpoint HTTP (he omitido ese m\u00e9todo ya que los detalles no son importantes ahora. Tambi\u00e9n he omitido cualquier uso de Promise\/callback que ser\u00eda necesario en una situaci\u00f3n as\u00edncrona como esta).<\/li>\n<li>Estoy eliminando la empresa del campo empresas (haciendo un bucle y eliminando la empresa con el id correspondiente). Alternativamente, podr\u00eda llamar a loadCompanies y actualizar toda la lista de nuevo, y eso significar\u00eda otro viaje a la base de datos.<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>El paso 3 contiene algo de la magia de Angular2 que deber\u00edas conocer: cuando el bot\u00f3n <code><code>empresas<\/code><\/code> Angular2 se dar\u00e1 cuenta y actualizar\u00e1 autom\u00e1ticamente el HTML renderizado ejecutando el comando <code>*ngPor<\/code><\/code> bucle de nuevo.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"trueother-stuff\">Otras cosas<\/h3>\n<div class=\"paragraph\">\n<p>Algunas otras cosas que he estado haciendo que puedo bloguear m\u00e1s tarde:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Formularios en Angular2: me permitir\u00edan crear\/editar empresas en el ejemplo anterior.<\/li>\n<li>Bibliotecas\/plugins JavaScript: para el <code>borrar<\/code><\/code> ser\u00eda bueno tener un di\u00e1logo de confirmaci\u00f3n. Estoy utilizando <a href=\"https:\/\/getbootstrap.com\/\">arranque<\/a>...as\u00ed que estar\u00eda bien si pudiera... <a href=\"https:\/\/bootboxjs.com\/\">introducir bootbox<\/a> para usar en los di\u00e1logos de confirmaci\u00f3n.<\/li>\n<li>Promesas: son importantes cuando se trabaja de forma as\u00edncrona (como cuando se realizan peticiones HTTP a puntos finales de API)<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"trueconclusion\">Conclusi\u00f3n<\/h3>\n<div class=\"paragraph\">\n<p>Sigo siendo un esc\u00e9ptico sobre los beneficios a largo plazo de estos frameworks JS y del propio TypeScript (<a href=\"https:\/\/twitter.com\/mgroves\">preg\u00fantame alguna vez en Twitter<\/a>), pero estoy tomando medidas para aprender las herramientas. Si despu\u00e9s de todo esto sigo siendo esc\u00e9ptico, al menos no ser\u00e9 un esc\u00e9ptico ignorante.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Algunos recursos para seguir explorando TypeScript y Angular2:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.typescriptlang.org\/\">TypeScript<\/a><\/li>\n<li><a href=\"https:\/\/angular.io\/\">Angular<\/a><\/li>\n<li><a href=\"https:\/\/visualstudiogallery.msdn.microsoft.com\/4190ee5c-15d9-4afe-ac14-515bdb6493da\">Aplicaci\u00f3n de ejemplo Angular2<\/a> para Visual Studio<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>The CEAN (pronounced &#8220;keen&#8221;) stack is used to design web apps with a segregated UI (it\u2019s like the MEAN stack, except it uses Couchbase Server). I\u2019m learning and writing Angular2 for the first time this month, so I thought I [&hellip;]<\/p>","protected":false},"author":71,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1816],"tags":[1704,1719,1718],"ppma_author":[8937],"class_list":["post-2372","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-server","tag-angular","tag-cean","tag-typescript"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Learning Angular2 for the CEAN Stack - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/learning-angular2-for-the-cean-stack\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Learning Angular2 for the CEAN Stack\" \/>\n<meta property=\"og:description\" content=\"The CEAN (pronounced &#8220;keen&#8221;) stack is used to design web apps with a segregated UI (it\u2019s like the MEAN stack, except it uses Couchbase Server). I\u2019m learning and writing Angular2 for the first time this month, so I thought I [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/learning-angular2-for-the-cean-stack\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-08-17T14:59:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-11T07:43:22+00:00\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Learning Angular2 for the CEAN Stack\",\"datePublished\":\"2016-08-17T14:59:45+00:00\",\"dateModified\":\"2023-09-11T07:43:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/\"},\"wordCount\":885,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"CEAN\",\"TypeScript\"],\"articleSection\":[\"Application Design\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/\",\"name\":\"Learning Angular2 for the CEAN Stack - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-08-17T14:59:45+00:00\",\"dateModified\":\"2023-09-11T07:43:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Learning Angular2 for the CEAN Stack\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Learning Angular2 for the CEAN Stack - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/learning-angular2-for-the-cean-stack\/","og_locale":"es_MX","og_type":"article","og_title":"Learning Angular2 for the CEAN Stack","og_description":"The CEAN (pronounced &#8220;keen&#8221;) stack is used to design web apps with a segregated UI (it\u2019s like the MEAN stack, except it uses Couchbase Server). I\u2019m learning and writing Angular2 for the first time this month, so I thought I [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/learning-angular2-for-the-cean-stack\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-08-17T14:59:45+00:00","article_modified_time":"2023-09-11T07:43:22+00:00","author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Learning Angular2 for the CEAN Stack","datePublished":"2016-08-17T14:59:45+00:00","dateModified":"2023-09-11T07:43:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/"},"wordCount":885,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Angular","CEAN","TypeScript"],"articleSection":["Application Design","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/","url":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/","name":"Learning Angular2 for the CEAN Stack - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-08-17T14:59:45+00:00","dateModified":"2023-09-11T07:43:22+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/learning-angular2-for-the-cean-stack\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Learning Angular2 for the CEAN Stack"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","first_name":"Matthew","last_name":"Groves","user_url":"https:\/\/crosscuttingconcerns.com","author_category":"","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2372"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2372\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2372"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}