В React есть хороший шаблон, в котором пустой атрибут компонента интерпретируется как истинное значение во время рендеринга.

Синтаксис HTML

Это также очень похоже на собственный синтаксис HTML, где определенные атрибуты обеспечивают логическую семантику, например:

<button type="submit" class="submit-button" disabled>Submit</button>

Атрибут disabled является логическим значением, функционально эквивалентным disabled="true" (кнопка выше отключена).

Реагировать на синтаксис

В React есть что-то подобное. Итак, если у вас есть компонент, определенный следующим образом:

import React, { Component } from 'react';
export default class Foo extends Component {
  render() {
    if (this.props.loggedIn) {
      return "Welcome back!";
    } else {
      return "Hello world!";
    }
  }
}

И вы, вероятно, уже знаете это, но затем вы можете вызвать компонент таким образом и получить вывод из ветки true этого условного выражения:

<Foo loggedIn /> // Welcome back!

Это хороший API для разработчика, который может использовать этот компонент в своем приложении.

Эмбер синтаксис?

Ember недавно представил вызов угловой скобки. Я не буду вдаваться в многочисленные почему и как нового синтаксиса и функций, но, возможно, наиболее очевидным изменением является новое визуальное сходство с React и нативной HTML-разметкой при использовании компонентов.

И поэтому с этим изменением я спросил себя: возможны ли логические атрибуты в синтаксисе угловых скобок Ember?

// angle-foo.hbs
{{#if @loggedIn}}
  Welcome back!
{{else}}
  Hello world
{{/if}}

И вызывается так:

<AngleFoo @loggedIn /> // Hello world :(

Это не сработает. @loggedIn оценивается как false, если вы передаете его в качестве аргумента без значения.

Пустые @arguments имеют значение

Но давайте посмотрим поближе. Используя помощник {{log}}, мы можем увидеть, действительно ли игнорируется @loggedIn или есть значение, с которым мы можем работать.

// angle-foo.hbs
{{log '@loggedIn:' @loggedIn}}
{{#if @loggedIn}}
  Welcome back!
{{else}}
  Hello world
{{/if}}
// templates/application.hbs
<AngleFoo />

Отсутствие передачи ключа @loggedIn приводит к значению undefined. Но что, если мы используем синтаксис логического атрибута? Какое значение мы получаем?

// templates/application.hbs
<AngleFoo @loggedIn />

Забавно, но если вы передадите пустую строку ('') в console.log Chrome, вы получите пробел:

Итак, если пустая строка выглядит как пустое место при регистрации, означает ли это, что значение пустого ключа в синтаксисе угловых скобок является пустой строкой?

Давайте разберемся. Нам понадобится всегда полезный ember-truth-helpers для реализации.

// angle-foo.hbs
{{log '@loggedIn:' @loggedIn}}
{{#if (eq @loggedIn '')}}
  Welcome back!
{{else}}
  Hello world
{{/if}}
// templates/application.hbs
<AngleFoo @loggedIn />

Вот оно! используя простое условное выражение, мы можем разблокировать новый удобный API для других разработчиков (и самих себя), которые используют наши компоненты.

Недостатком является то, что это может быть чем-то вроде WAT для других инженеров, которые привыкли к соглашениям Ember, но если вы правильно документируете (возможно, используя ember-cli-addon-docs), то вы обнаружите, что это простой способ добавить выразительности вашим компонентам Ember. .