0

我在我的 ASP.NET MVC4 项目中使用 Knockout.js 并结合 SignalR 实现工业设施的实时可视化。我们有许多页面,其中跨度或文本框数据绑定到视图模型。每隔 2 到 10 秒,服务器会通过 SignalR 向客户端浏览器发送一个新值,并且视图模型中的值(以及 span、div 或文本框输入中的文本)会更新。这很好用。我想要实现的是页面上的某种视觉通知(例如,jQuery-highlight 显示该值的 DOM 元素)每当值发生变化时。

我猜 knockout.js 事件绑定接近我需要的,但据我所知,它只能将相关的视图模型项传递给 JS 函数,而不是我需要突出显示的 DOM 元素。我希望我能理解这个想法。

因此,我需要一种在文本框输入的值从“代码隐藏”而不是手动用户输入更改时触发函数的方法。这个函数应该被赋予相关的 DOM 元素以便进一步处理。

到目前为止我的代码:

    <table class="StatusRowList">
        <thead>
            <tr>
                <th>Parameter</th>
                <th>Value</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: Items">
            <tr>
                <td><a data-bind="attr: { href: '/Archive/Show/?StationId=' + StationId() + '&DataPointId=' + DpId() }"><span data-bind="text: Text"></span></a></td>
                <td>
                    <span data-bind="text: UnitPrefix"></span>
                    <input data-bind="value: Value" />
                    <span data-bind="text: UnitSuffix"></span>
                </td>
            </tr>
        </tbody>
    </table>

感兴趣的线是两个跨度之间的“输入”。感谢您的帮助!

4

1 回答 1

0

没有办法区分 observable 是从绑定还是从 ViewModel 设置的。您将不得不编写一个 ko 扩展器来修复此问题,例如

http://jsfiddle.net/a3fFa/

ko.extenders.eventDriven = function(target, options) {
    var computed = ko.computed({
        read: target,
        write: target
    });
    computed.updatedFromEvent = ko.observable(false);
    computed.onEvent = function(value) {
        target(value);
        computed.updatedFromEvent(true);
    }    

    return computed;
};

编辑: 我为这个 btw 做了一个框架, https://github.com/AndersMalmgren/Knockout.Concurrency 但它更旨在检测另一个用户何时保存并将冲突呈现给用户 http://jsfiddle.net/7atZT/ 1/

于 2013-06-04T09:13:14.480 回答