【问题标题】:Tracking Changes in a Knockout Model and trigger a change in CSS when an input is changed跟踪 Knockout 模型中的更改并在输入更改时触发 CSS 中的更改
【发布时间】:2012-10-12 16:10:02
【问题描述】:

我有一个包含大约 50 个各种输入的 Knockout View。我已经通过以下代码跟踪模型何时发生更改

self.Changed = ko.computed(function() {
    return ko.toJS(self.Outing);
});

然后订阅 Changed 函数将模型保存回服务器。我想要完成的是,当用户更改单个输入时,它会触发对该输入的 css 绑定以突出显示它,以便用户知道他/她更改了什么。如果不单独订阅每个可观察属性,我该如何做到这一点?

【问题讨论】:

  • 查看KoLite plugin,它包含用于更改跟踪的助手。
  • 我相信 KoLite 中的 IsDirty 标志是为了替换我已经在使用的 self.Changed 函数,但并未设置为真正通知您哪个特定项目已更改。

标签: knockout.js


【解决方案1】:

有几种方法可以处理这样的事情。一种方便的方法可能是自定义绑定,它获取原始值并针对查看原始值与当前值的计算设置一个 css 绑定。

可能是这样的:

ko.bindingHandlers.changedCss = {
    init: function(element, valueAccessor, allBindings) {
        var original, isDirty, data, cssClass, binding;

        data = allBindings().value;
        original = ko.utils.unwrapObservable(data);
        isDirty = ko.computed({
            read: function() {
                return ko.utils.unwrapObservable(data) !== original;
            },            
            disposeWhenNodeIsRemoved: element
        });

        cssClass = ko.utils.unwrapObservable(valueAccessor());
        binding = { css: {} };
        binding.css[cssClass] = isDirty;

        ko.applyBindingsToNode(element, binding);       
    }                          
};

你会像这样使用它:<input data-bind="value: first, changedCss: 'changed'" />

因此,我们的想法是我们寻找绑定 value 的对象,并即时设置计算的 observable 为我们提供此属性的脏标志。然后,使用传递给绑定的类名以编程方式添加css 绑定。

http://jsfiddle.net/rniemeyer/PCmma/

或者,您可以创建一个扩展,让您从视图模型端添加此脏跟踪。这会给你一些额外的灵活性,比如重置跟踪的能力(认为当前值是干净的)。对于初学者,您可以执行以下操作:

ko.subscribable.fn.trackDirtyFlag = function() {
    var original = this();

    this.isDirty = ko.computed(function() {
        return this() !== original;
    }, this);

    return this;    
};

然后,像这样使用它:this.first = ko.observable("John").trackDirtyFlag();

http://jsfiddle.net/rniemeyer/JtvWd/

然后您可以添加一个reset 方法,将original 设置为当前值。

如果您的目标只是能够为脏字段着色,那么自定义绑定可能是一个不错的选择,因为您根本不需要更改视图模型。

【讨论】:

  • 我正沿着绑定到更改事件的路径前进,但您的自定义活页夹解决方案更加优雅。感谢您的帮助。
  • Ryan- 一个简单的问题。我将如何更改第一个解决方案以在我的某些输入框上也使用一些自定义绑定。
  • Ryan- 我想通了。对于那里的任何人,jsfiddle.net/pltaylor3/5AkWX 的小提琴已更新,以展示如何更改 Ryans 对自定义绑定的回答。
  • 另一种选择可能是将要跟踪的可观察对象传递给自定义绑定,然后将 css 类设置为绑定的属性,例如:jsfiddle.net/rniemeyer/5AkWX/3
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多