1

我做了一个单页应用的解决方案,将用于厂房的大屏幕显示,显示一组机器的状态信息和性能指标。通过一个通过ajax 调用派生的设置文件,应用程序知道哪些机器应该显示哪些信息。因此,为每台机器提供一个模板,并为每台机器信息呈现一个嵌套模板(koExternaltemplateengine)。此外,第一个 ajax 调用包含所有机器的 ajax 调用的 url。这些调用的响应包含机器特定的值。这些调用会定期重复并刷新显示值。所有绑定都使用敲除和映射插件进行,以避免具有硬编码的视图模型客户端。

现在我的问题是:如果所有机器的所有 ajax 调用都为显示提供所需的数据,那么一切正常。但是:对于某些机器,有时(也在初始加载时),调用成功(200)但只包含空值(因为此时数据不可用)。现在我遇到了问题。在 ko.applybindings(machinedata, machinediv) 我得到“无法解析绑定”。对于绑定值字段,ko 终止绑定。所以显示没有完整呈现,也没有触发更新。

现在我将尝试使用 if/ifnot-bindings,但是如果在刷新后出现初始未绑定值会发生什么?(手动重新触发 applybindings,除了 ko.mapping.fromJS??)。

有人有类似的问题吗?有什么建议么?正如我所提到的,我想避免硬编码的视图模型,以方便将来扩展更多机器属性。

4

1 回答 1

0

您可以将您的机器数据存储在 observable 中:

您的看法:

<div data-bind="if: machinedata()>
   <div data-bind="with: machinedata()">
      ...
   </div>
</div>
<div data-bind="if: machinedata()>
   Data could not be loaded....
</div>

视图模型:

var ViewModel = function () {
    var self = this;

    self.machinedata = ko.observable();

    self.update = function () {
        var data = someAjaxCall(); // returns the data or any falsy value
        self.machinedata(data);
    };
}

var viewModel = new ViewModel();
ko.applyBinding(viewModel);  // data does not yet exist
viewModel.update();

只要您只绑定加载的数据并且不需要任何计算,您甚至不需要 ko.mapping。

于 2013-02-08T20:37:45.817 回答