В 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. .