gpt4 book ai didi

knockout.js - 在自定义 knockout 绑定(bind)的 init 和 update 之间存储状态的首选方法是什么?

转载 作者:行者123 更新时间:2023-12-03 05:50:26 25 4
gpt4 key购买 nike

目前我正在使用 dom 元素的 jQuery 数据存储状态。

ko.bindingHandlers.customValue = {

init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var state = { isEditing: false };
$(element).focus(function focus() {
state.isEditing = true;
}).blur(function blur() {
state.isEditing = false;
}).data("customBinding", state);

},

update: function update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// ignore if updating
if (!$(element).data("customBinding").isEditing) {
// handle update if they are not updating
}
}

};​

是否有更好的地方来存储不需要 dom 的每个绑定(bind)的状态? BindingContext 可以用于存储绑定(bind)的每个实例的状态吗?

最佳答案

BindingContext 是一种可能性,但仅用于在第一次触发绑定(bind)时将数据从 init 传递到 update。下次 update 触发时,它将不再存在。

存储这种类型状态的位置实际上有两种选择:

1- 正如您所说,在元素上。您可以使用 jQuery 的 $.data 或 KO 包含的 API 来执行此操作,以及 ko.utils.domData.get(element, key)ko.utils。 domData.set(元素,键,值)

2- 如果合适,请将此类信息放入您的 View 模型中。指示 isEditing 的标志不一定在 View 模型中不合适。我个人喜欢将这种类型的“元数据”作为可观察量的子可观察量,例如:

var name = ko.observable("Bob");
name.isEditing = ko.observable(false);

您将能够绑定(bind) namename.isEditing

这有一些优点:

  • 保持 View 模型相当干净,因为您没有引入新的顶级属性
  • 使子可观察对象与其父可观察对象保持联系(不需要 nameIsEditing 等)
  • 当使用 ko.toJSON 之类的东西转换为 JSON 时,isEditing 子可观察对象将在其父对象解包时被删除。因此,您不会将不必要的值发送回服务器。
  • 在这种情况下,它还具有可用于 View 模型中的其他计算或绑定(bind)到 UI 中的多个元素的优势。

关于knockout.js - 在自定义 knockout 绑定(bind)的 init 和 update 之间存储状态的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166110/

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