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);
}))
])
};
}