{"id":1324,"date":"2026-03-29T09:57:59","date_gmt":"2026-03-29T12:57:59","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1324"},"modified":"2026-03-29T09:57:59","modified_gmt":"2026-03-29T12:57:59","slug":"angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/","title":{"rendered":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente"},"content":{"rendered":"\n<p>Angular Signals lleg\u00f3 para transformar la forma en que construimos aplicaciones reactivas. En este art\u00edculo exploramos escenarios del mundo real donde los Signals cambian radicalmente el dise\u00f1o de tus componentes Angular: desde inputs reactivos hasta routing con par\u00e1metros de ruta y llamadas a APIs declarativas con <code>httpResource()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema con ngOnChanges: el viejo paradigma imperativo<\/h2>\n\n\n\n<p>Durante a\u00f1os, reaccionar a cambios en los inputs de un componente implicaba escribir c\u00f3digo verboso y fr\u00e1gil usando <code>ngOnChanges<\/code>. Por cada nuevo <code>@Input()<\/code>, la complejidad crec\u00eda de forma no lineal, con l\u00f3gica condicional duplicada y errores dif\u00edciles de detectar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Enfoque tradicional con ngOnChanges\n@Component({ selector: 'legacy-config-panel', template: '...' })\nexport class LegacyConfigPanel implements OnChanges {\n  @Input() userRole!: string;\n  @Input() theme!: 'light' | 'dark';\n\n  isAdminView = false;\n  isDarkMode = false;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['userRole']) this.isAdminView = this.userRole === 'admin';\n    if (changes['theme']) this.isDarkMode = this.theme === 'dark';\n  }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Angular Signals: dise\u00f1o declarativo con input() y computed()<\/h2>\n\n\n\n<p>Con Angular Signals, cada pieza de estado derivado se expresa como una funci\u00f3n de sus inputs. No m\u00e1s <code>ngOnChanges<\/code>, no m\u00e1s boilerplate. Angular garantiza que cuando un input signal cambia, los valores <code>computed()<\/code> se actualizan autom\u00e1ticamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component({ selector: 'config-panel', template: '...' })\nexport class ConfigPanel {\n  userRole = input&lt;string>();\n  theme = input&lt;'light' | 'dark'>();\n  region = input&lt;string>();\n  featureFlags = input&lt;string[]>();\n\n  readonly isAdminView = computed(() => this.userRole() === 'admin');\n  readonly isDarkMode = computed(() => this.theme() === 'dark');\n  readonly showLegalBanner = computed(() =>\n    this.region() === 'EU' &amp;&amp;\n    this.userRole() !== 'admin' &amp;&amp;\n    !this.featureFlags()?.includes('suppress-legal')\n  );\n}<\/code><\/pre>\n\n\n\n<p>Este enfoque establece un nuevo contrato entre componentes: los inputs son valores vivos, el estado derivado es expl\u00edcito y las actualizaciones son autom\u00e1ticas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Queries Reactivas: viewChild() y contentChild()<\/h2>\n\n\n\n<p>Los decoradores <code>@ViewChild<\/code> y <code>@ContentChild<\/code> tradicionales eran lookups est\u00e1ticos atados al ciclo de vida del componente. Con Signal-based queries, obtenemos una <code>Signal&lt;T | undefined><\/code> verdaderamente reactiva.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Antes: dependiente del ciclo de vida\n@ViewChild(CustomCardHeader) header!: CustomCardHeader;\nngAfterViewInit() {\n  if (this.header) this.header.setFocus();\n}\n\n\/\/ Ahora: completamente reactivo\nheader = viewChild(CustomCardHeader);\nreadonly hasHeader = computed(() => !!this.header());\n\neffect(() => {\n  if (this.header()) this.header()!.setFocus();\n});<\/code><\/pre>\n\n\n\n<p>El c\u00f3digo dentro de <code>effect()<\/code> se re-ejecuta autom\u00e1ticamente cuando el componente entra o sale del DOM, sin necesidad de gestionar <code>ngAfterViewInit<\/code> ni <code>ExpressionChangedAfterItHasBeenChecked<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Two-Way Binding Moderno: la API model()<\/h2>\n\n\n\n<p>La nueva API <code>model()<\/code> simplifica radicalmente el two-way binding. En lugar de coordinar manualmente un <code>@Input()<\/code> con su correspondiente <code>@Output()<\/code>, basta con declarar un <code>WritableSignal<\/code> con <code>model()<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Antes\n@Input() value = 0;\n@Output() valueChange = new EventEmitter&lt;number>();\nincrement() { this.valueChange.emit(this.value + 10); }\n\n\/\/ Ahora con model()\nexport class CustomSlider {\n  value = model(0);\n  increment() { this.value.update(old => old + 10); }\n}\n\n\/\/ En el componente padre\n&lt;custom-slider [(value)]=\"volume\" \/><\/code><\/pre>\n\n\n\n<p><strong>Nota importante:<\/strong> <code>model()<\/code> no reemplaza <code>ControlValueAccessor<\/code> todav\u00eda. CVA sigue siendo necesario para integraci\u00f3n con <code>FormControl<\/code> y <code>formControlName<\/code>. Sin embargo, muchos casos de uso que antes requer\u00edan CVA ahora pueden resolverse con <code>model()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Par\u00e1metros de Ruta como Signals con withComponentInputBinding()<\/h2>\n\n\n\n<p>Con <code>withComponentInputBinding()<\/code>, los par\u00e1metros de ruta se mapean directamente a inputs del componente como signals. Adi\u00f3s a <code>ActivatedRoute<\/code>, adi\u00f3s a subscripciones manuales.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ app.config.ts\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideRouter(routes, withComponentInputBinding()),\n  ],\n};\n\n\/\/ project-details.component.ts\nexport class ProjectDetailsComponent {\n  \/\/ Angular mapea ':projectId' autom\u00e1ticamente como Signal\n  projectId = input&lt;string>();\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Carga de Datos Reactiva con httpResource()<\/h2>\n\n\n\n<p>La API experimental <code>httpResource()<\/code> es quiz\u00e1s el caso de uso m\u00e1s poderoso: conectar directamente un Signal de par\u00e1metro de ruta con una llamada HTTP, obteniendo tres signals listos para usar: <code>data<\/code>, <code>loading<\/code> y <code>error<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component({\n  standalone: true,\n  template: \n    @if (loading()) { &lt;p>Cargando\u2026&lt;\/p> }\n    @if (error()) { &lt;p>Error: {{ error() }}&lt;\/p> }\n    @if (data(); as project) {\n      &lt;h1>{{ project.name }}&lt;\/h1>\n      &lt;p>{{ project.description }}&lt;\/p>\n    }\n  \n})\nexport class ProjectDetailsComponent {\n  projectId = input.required&lt;string>();\n\n  resource = httpResource(() => \/api\/projects\/);\n\n  data = this.resource.data;\n  loading = this.resource.loading;\n  error = this.resource.error;\n}<\/code><\/pre>\n\n\n\n<p>Cuando <code>projectId()<\/code> cambia (por ejemplo, al navegar entre proyectos), <code>httpResource()<\/code> lanza autom\u00e1ticamente una nueva petici\u00f3n HTTP. Todo el flujo \u2014 desde el par\u00e1metro de ruta hasta la respuesta del servidor \u2014 es reactivo y declarativo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n: El futuro de Angular es reactivo y declarativo<\/h2>\n\n\n\n<p>Angular Signals no es solo una nueva sintaxis \u2014 es una nueva forma de pensar el dise\u00f1o de componentes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>input() + computed()<\/strong>: Elimina ngOnChanges y l\u00f3gica imperativa<\/li>\n<li><strong>viewChild() \/ contentChild()<\/strong>: Queries reactivas sin lifecycle hooks<\/li>\n<li><strong>model()<\/strong>: Two-way binding declarativo sin boilerplate<\/li>\n<li><strong>withComponentInputBinding()<\/strong>: Par\u00e1metros de ruta como signals<\/li>\n<li><strong>httpResource()<\/strong>: API calls declarativas y reactivas<\/li>\n<\/ul>\n\n\n\n<p>La combinaci\u00f3n de todos estos elementos permite construir aplicaciones donde los datos fluyen de forma coherente desde los par\u00e1metros de ruta hasta la UI, con m\u00ednimo c\u00f3digo de pegamento y m\u00e1xima legibilidad.<\/p>\n\n\n\n<p><em>Art\u00edculo basado en <a href=\"https:\/\/www.codemag.com\/Article\/2511041\/Angular-Signals-in-the-Real-World-Smarter-Inputs-and-Reactive-Routing\" target=\"_blank\" rel=\"noopener\">Angular Signals in the Real World<\/a> de CODE Magazine.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprende a usar Angular Signals en escenarios del mundo real: inputs reactivos con input() y computed(), queries con viewChild(), two-way binding con model(), par\u00e1metros de ruta como signals y llamadas HTTP declarativas con httpResource().<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[274,429,427,431,276,293,277,428,278,430],"class_list":["post-1324","post","type-post","status-publish","format-standard","hentry","category-blog","tag-angular","tag-angular-17","tag-angular-signals","tag-computed","tag-frontend","tag-httpresource","tag-javascript","tag-reactive-programming","tag-typescript","tag-web-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal<\/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:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Aprende a usar Angular Signals en escenarios del mundo real: inputs reactivos con input() y computed(), queries con viewChild(), two-way binding con model(), par\u00e1metros de ruta como signals y llamadas HTTP declarativas con httpResource().\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-29T12:57:59+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\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:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente\",\"datePublished\":\"2026-03-29T12:57:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/\"},\"wordCount\":507,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"angular\",\"Angular 17\",\"Angular Signals\",\"computed\",\"frontend\",\"httpresource\",\"javascript\",\"Reactive Programming\",\"typescript\",\"Web Development\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/\",\"name\":\"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-29T12:57:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal","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:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/","og_locale":"es_ES","og_type":"article","og_title":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal","og_description":"Aprende a usar Angular Signals en escenarios del mundo real: inputs reactivos con input() y computed(), queries con viewChild(), two-way binding con model(), par\u00e1metros de ruta como signals y llamadas HTTP declarativas con httpResource().","og_url":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-29T12:57:59+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente","datePublished":"2026-03-29T12:57:59+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/"},"wordCount":507,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["angular","Angular 17","Angular Signals","computed","frontend","httpresource","javascript","Reactive Programming","typescript","Web Development"],"articleSection":["Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/","url":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/","name":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-29T12:57:59+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/angular-signals-en-el-mundo-real-inputs-reactivos-y-routing-inteligente\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular Signals en el Mundo Real: Inputs Reactivos y Routing Inteligente"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1324"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1324\/revisions"}],"predecessor-version":[{"id":1325,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1324\/revisions\/1325"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}