我有一个简单的手风琴:
<div>
<button aria-expanded='false' aria-controls='content'>
Open accordion
</button>
<div id='content' aria-hidden='true'>
This the accordion's hidden content.
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我使用 Javascript 打开/关闭手风琴并设置标签aria-*。
一切正常,但是当我在内容中添加链接时:
<div>
<button aria-expanded='false' aria-controls='content'>
Open accordion
</button>
<div id='content' aria-hidden='true'>
This is the accordion's hidden content.
<a href='https://www.google.com'>Go to Google</a>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
灯塔给了我这个:
[aria-hidden="true"] elements contain focusable descendents
Run Code Online (Sandbox Code Playgroud)
在我看来,添加tabindex='-1'到a标签可以解决这个问题:
[aria-hidden="true"] elements contain focusable descendents
Run Code Online (Sandbox Code Playgroud)
然而,这使得元素“不可选项卡”,这不利于可访问性。
我可以使用 JavaScript 手动查询手风琴内容中的所有a标签,但我什至不确定这是否真的解决了“问题”还是一个肮脏的解决方法?还有更好的选择吗?
真正的问题;HTTP 状态代码如此之多,人们总是鼓励您在某种情况下使用正确的状态代码。
除了常见的(200、404和500)之外,我发送回用户的 HTTP 状态代码真的很重要吗?
浏览器对每个状态代码执行的操作是否不同?
我的应用程序有两层:域和应用程序。每层都有自己的“错误”ADT。例如:
package com.domain.person
sealed trait DomainError
case object NoPermission extends DomainError
final case class Person(hasPermission: Boolean): Either[DomainError, ???] {
def doSomething() = {
if (!hasPermission)
Left(NoPermission)
else
...
}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序层(另一个包)中:
package com.application.person
sealed trait ApplicationError
case object PersonNotFound extends ApplicationError
case object UnexpectedFatalError extends ApplicationError
// and a function f :: Either ApplicationError Something
Run Code Online (Sandbox Code Playgroud)
问题是,由于DomainError生活在另一个包中,我不能简单地扩展我的ApplicationError特征:
package com.application.person
sealed trait ApplicationError
case object PersonNotFound extends ApplicationError
case object UnexpectedFatalError extends ApplicationError
// and a function f …Run Code Online (Sandbox Code Playgroud) 据我所知,Clean Architecture/DDD 声明您的用例可以由任何东西触发,让它是 HTTP 请求或 GUI,对吗?
我正在尝试模仿这一点,但我不确定我是否做得正确。
在我的infrastructure文件夹中,我有路由器。例如:
import express from 'express'
import UserController from '../controllers/user_controller.js'
import ExpressRouterAdapter from './ExpressRouterAdapter.js'
export default function UsersRouter () {
const router = express.Router()
router.route('/:username').get(ExpressRouterAdapter.adapt(UserController.getUser))
return router
}
Run Code Online (Sandbox Code Playgroud)
(ExpressRouterAdapter只是将 Express 请求转换为简单的 httpRequest JS 对象的适配器)
这是我的GetUser控制器:
import express from 'express'
import UserController from '../controllers/user_controller.js'
import ExpressRouterAdapter from './ExpressRouterAdapter.js'
export default function UsersRouter () {
const router = express.Router()
router.route('/:username').get(ExpressRouterAdapter.adapt(UserController.getUser))
return router
}
Run Code Online (Sandbox Code Playgroud)
我有几个问题:
PostUser …