我们正在使用 knockout 和 knockout 映射插件来促进jQTouch Web应用程序中的数据绑定(bind)。我们使用映射插件的原因是能够使用剔除而不需要在javascript中手动定义/更改 View 模型。当您从服务器/客户端数据库中初始加载数据时,映射插件非常有用。

我们遇到的问题是,我们有一些屏幕/ View ,其形式可能没有任何初始数据。没有这些初始数据,映射插件将无法“生成” View 模型(ko.mapping.fromJS)。这意味着我们仍然需要为大部分 View 手动定义 View 模型。

我是否以为这是映射插件(应该)支持的方案是错误的?我的意思是,这意味着映射插件仅在始终具有初始数据负载的情况下可用。

最佳答案

除了手动管理 View 模型之外,还为您提供了两个选项。映射插件支持create回调,可让您自定义其创建方式。如果默认属性恰好丢失,则可用于将默认属性添加到对象。

像这样:http://jsfiddle.net/rniemeyer/WQGVC/

另一种选择是使用绑定(bind)来创建缺少的属性。它可能看起来像:

//create an observable if it does not exist and populate it with the input's value
ko.bindingHandlers.valueWithInit = {
    init: function(element, valueAccessor, allBindingsAccessor, data) {
        var property = valueAccessor(),
            value = element.value;

        //create the observable, if it doesn't exist
        if (!ko.isWriteableObservable(data[property])) {
            data[property] = ko.observable();
        }

        //populate the observable with the element's value (could be optional)
        data[property](value);

        ko.applyBindingsToNode(element, { value: data[property] });
    }
}

您将像这样使用它(需要将属性作为字符串传递,否则会出错):
<input data-bind="valueWithInit: 'name'" />

此处示例:http://jsfiddle.net/rniemeyer/JPYLp/

09-18 03:15