Javascript Cycle.js应用程序未捕获类型错误

Javascript Cycle.js应用程序未捕获类型错误,javascript,html,rxjs,cyclejs,Javascript,Html,Rxjs,Cyclejs,我正在努力学习Cycle.js,必须说我发现它非常有趣。我正在尝试创建一个简单的应用程序,其中我有一个输入和一个ul。每次将一些值写入输入,然后我按enter键时,我想添加一个新的li,该值将被写入ul,但由于以下错误而失败 未捕获的TypeError:observables[\u name2]。DoError不是函数 首先,很高兴看到人们对自行车感兴趣 你在这里漏掉了一些要点,这就是你为什么要挣扎的原因 您可能还没有完全理解反应式编程的概念。你应该阅读的周期和手表的创造者。它们确实有助于理解循

我正在努力学习
Cycle.js
,必须说我发现它非常有趣。我正在尝试创建一个简单的应用程序,其中我有一个
输入
和一个
ul
。每次将一些值写入
输入
,然后我按enter键时,我想添加一个新的
li
,该值将被写入
ul
,但由于以下错误而失败

未捕获的TypeError:observables[\u name2]。DoError不是函数


首先,很高兴看到人们对自行车感兴趣

你在这里漏掉了一些要点,这就是你为什么要挣扎的原因

您可能还没有完全理解反应式编程的概念。你应该阅读的周期和手表的创造者。它们确实有助于理解循环在内部是如何工作的

此外,您还可以采用Cycle的命名约定,这非常有帮助。流/可观察流应该以
$
结尾,如

var click$ = DOM.select('a').events('click');
正如@juanrpozo所说的,您的主要问题在于
视图
函数,因为它返回的是一个虚拟树,而不是虚拟树的可观察部分。 另外,了解
state
变量是可观察的,而不是javascript数组也是很重要的。这就是为什么我认为你对Rx还不满意。你认为你在映射一个数组,但实际上你在映射一个可观察的,因此返回另一个可观察的,而不是数组。 但由于DOM接收器应该是可观察的,这很完美,因此您只需将VTree包装在地图中:

var view = function (state$) {
    return state$.map(function (values) {
        CycleDOM.body([
            CycleDOM.input({ type: 'text', value: '' }),
            CycleDOM.ul({ className: 'text' }, values.map(function (value) {
                CycleDOM.li(value);
            }))
        ])
    };
}
另一个问题是您的
状态$
管理。您必须了解,
state$
是组件的连续状态流。在stackoverflow上解释这一点有点困难,但是如果你阅读/观看我发给你的资源,你会毫无问题地得到它

我曾经让您进行了一次更正和更改,以更加尊重意图/模型/视图约定


您还遇到了其他错误,但这些是最重要的。

将程序逻辑放在一边,view()需要返回一个可观察的,state.map(…)中的函数也应该返回一些内容。是的,我仍在学习Rx,但仍然很享受。我知道我应该从
视图
函数返回一个
可观察的
,但不确定如何映射
ul
的子项。我可以问一下
scan
函数是做什么的吗?我刚刚运行了你的代码,它说
值。map
不是一个函数。
scan
允许你应用累加器函数:在这里你必须了解你的组件的状态实际上是一个字符串列表(数组)。什么定义了待办事项列表?这是要做的事情的清单。那是你的州。在代码中,状态只是一个字符串。所以为了维护和更新这个状态,我们要做的就是累积一个字符串列表。这就是为什么意图是“我添加一个新条目”,模型将此意图转换为“我将这个新条目添加到现有条目”,视图显示它们您是从jsbin获取代码还是只获取了一点点?由于它在jsbin上工作,我假设您只使用了它的一部分,因此在您的情况下,
可能不会被初始化(
未定义
'
)。这就是我代码中的
startWith([])
的用途。我似乎理解
startWith
scan
以及返回
流的视图的重要性。谢谢@chadrien。我们是否可以在其他地方再讨论一下这个概念?
var view = function (state$) {
    return state$.map(function (values) {
        CycleDOM.body([
            CycleDOM.input({ type: 'text', value: '' }),
            CycleDOM.ul({ className: 'text' }, values.map(function (value) {
                CycleDOM.li(value);
            }))
        ])
    };
}