gpt4 book ai didi

javascript - 可重复使用的属性验证与 knockout

转载 作者:行者123 更新时间:2023-11-28 02:17:39 25 4
gpt4 key购买 nike

我有以下类,它验证名称并且不允许用户输入空名称。有了它,我可以获得有效值,并在输入无效时通知用户(保留最后一个有效值)。

class @Person
constructor: (name) ->
@name = ko.observable name
@nameLastInvalid = ko.observable false
@nameAttempt = ko.computed
read: @name
write: (value) =>
if value.length > 0
@name value
@nameLastInvalid false
else
@nameLastInvalid true
owner: @

我想让相同的功能更加可重用。有没有办法扩展 ko.observable 对象以添加“lastInvalid”和“attempt”方法?

类似于:

class @Person
constructor: (name) ->
@name = ko.observable(name).extend({ required: true })

然后能够做到:

person.name()
person.name().lastInvalid()
person.name().attempt()

据我所知knockout-validation这样行不通。它允许您输入无效值,然后告诉您它是否有效。

更新:

我添加了以下扩展程序,但它似乎没有执行任何操作(我得到 name.attempt 未定义)

ko.extenders.required = (target, option) ->
target.lastInvalid = ko.observable false
target.attempt = ko.computed ->
read: target
write: (value) ->
if value.length > 0
target value
target.lastInvalid false
else
target.lastInvalid true
target

最佳答案

您的扩展程序偏向不起作用,因为您在 attempt 定义中有额外的 -> 。因为当您想要向计算提供读取、写入函数时,您需要提供对象文字而不是函数:

target.attempt = ko.computed
read: target
write: (value) ->
if value.length > 0
target value
target.lastInvalid false
else
target.lastInvalid true
target

并且您尝试从基础值而不是可观察本身访问附加属性。所以你需要写:

person.name()
person.name.lastInvalid()
person.name.attempt()

演示 JSFiddle .

关于javascript - 可重复使用的属性验证与 knockout ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com