为什么此重新帧命令仅在浏览器位于特定本地主机地址时才有效?它不应该只是数据库的接口吗?



我一直在使用Clojure、ClojureScript、lein、shadow cljs、Emacs和CIDER来开发Clojure/ClojureScript动态web应用程序项目。

通常,我在Emacs中的cljs中执行命令cider jack来构建项目,选择shadow-cljs,然后选择shadow作为REPL类型,最后选择app作为构建选项。

它运行良好。我可以在localhost:3005上查看UI上的更改。

不过,有一些奇怪的事情我不理解(考虑到我是Clojure堆栈的新手(。

在REPL上我可以做:

cljs.user> @(re-frame.core/subscribe [:the-selections])
{:firm "cb08795f-378b-4eb0-9404-ad83b83a8474",
:active-client "Random-client",
:active-atb "c6193c35-bf91-4711-8523-d905bd7f0a03"}

由我插入并由REPL检索的关键字与项目相关。

我怀疑的是,只有当浏览器位于特定页面(地址(时,这才有效。此处的身份验证不相关。

http://localhost:3005/link/random-numbers-asidadbsadkfbajhksdbf9283492374上,它起作用:

cljs.user> @(re-frame.core/subscribe [:the-selections])
{:firm "cb08795f-378b-4eb0-9404-ad83b83a8474",
:active-client "Random-client",
:active-atb "c6193c35-bf91-4711-8523-d905bd7f0a03"}

但是,如果将Chrome浏览器上的地址栏更改为浏览器正确呈现的另一个有效路径http://localhost:3005/another-path

如果尝试相同的命令,令人惊讶的是REPL检索nil:

cljs.user> @(re-frame.core/subscribe [:the-selections])
nil

即使在身份验证之后,即使浏览器地址在主页中,上面的命令也不能工作。它只在地址位于特定页面后才起作用。

此外,根据@ThomasHeller的评论,发布:the-selections的定义似乎是相关的。我不确定这是定义的根源,但这是我最好的选择:

(rf/reg-sub
:the-selections
;; Only returns something if all :firm, :active-client, and
;; :active-atb are present. :raw-selections defined in
;; selections.cljs omits validation if (rarely) needed.  selections
;; are only stored locally in re-frame's app-db, not in firebase,
;; like :the-client and :the-atb. Minor selections components which
;; are not part of the validation are :active-account and :active-je
(fn [_q _d]
(rf/subscribe [:raw-selections]))
(fn [selections _q]
(tc-selections/valid-selections selections)))

这种行为很吸引我。re-frame.core/subscribe不是数据库的接口吗?

根据重新框架的文件:

当视图函数使用订阅时,如下图所示(subscribe[:something:needed](,将创建为该订阅提供服务所需的节点的子图。必要的子图将";向后生长";从视图函数一直到应用程序数据库。

如果是这样,为什么在正确构建和身份验证之后,浏览器上的地址栏会很重要?

如果不知道:the-selections是如何定义的,这是不可能回答的。

然而,一种猜测是该值由";路由器";。它基本上获取URL并将一些与之相关的数据放入app-db中。在URI以/link开头的情况下,它可能正在创建必要的数据,而其他URI则没有。

最新更新