javascript - Knockout - 通过设置对象的属性来更改对象的 'subclass'

标签 javascript knockout.js subclass

在 Knockout 中,我有一个 Setting 实体数组,它们可能具有不同的类型(即设置实体的“子类”)。这些类型是动态的,用户可以在 UI 中更改它们。根据设置实体的类型,它需要不同的对象属性,并使其他属性变得多余。

我当前正在做的事情(我想要更改)是定义一个设置构造函数,它具有所有设置类型所需的所有属性;使构造函数非常庞大,并且包含许多不必要的属性。保存应用程序数据时,我“忽略”根据其类型不应出现在设置实例上的属性。

我已经在 this fiddle 中尝试过了,使用 type 属性的订阅来添加/删除类型更改时的属性。我想知道 KnockoutJS 是否可以在运行时可靠地更改对象的属性(即订阅是否总是在模板更新之前触发?)并且这会< strong>对性能有任何[积极]影响吗?。或者这种方法完全错误,我应该用子类实例替换整个对象(如果是这样,订阅不会丢失)吗?

编辑:依赖属性是实际数据(因此它们应该保存到模型中,而不仅仅是在 View 中可用)。我已经尝试过组件方法,但是稍后如何检索它们的属性? http://jsfiddle.net/kevinvanlierde/zmx3u4an/1/

最佳答案

为了解决保存属性的问题,我重新设计了组件代码。有些成员(主要是计算的)仅用于 View ,不应保存,因此我将可保存的内容放在“数据”成员中:

function Setting(params) {
    var self = this;
    // What getData fetches
    self.data = {
        type: ko.observable(params.type),
        value: ko.observable(params.value || '')
    };
    self.data.type.subscribe(function (value) {
        // Give the conversion a little time
        setTimeout(function () {
            console.log("GetData:", self.getData());
        }, 30);
    });
}

每个专用类型都会将其特殊成员添加到基本对象中,并将添加一个方法toSetting,以将其恢复为基本对象类型。基本类型在其原型(prototype)中有一个不执行任何操作的 toSetting 版本,因此在类型转换器中首先调用 toSetting 始终是安全的。

我向标题类型添加了一个 headingSize 参数,并使其确定文本显示的标题大小。

function toTitle(setting) {
    var self = setting;
    var data = setting.data;
    var value = data.value();
    self.toSetting();
    data.headingSize = ko.observable(4);
    self.capitalized = ko.computed(function () {
        return value ? value.slice(0, 1).toUpperCase() + value.slice(1) : '';
    });
    self.headerText = ko.computed(function () {
        return '<h' + data.headingSize() + '>' + self.capitalized() + '</h' + data.headingSize() + '>';
    });
    self.toSetting = function () {
        delete self.data.headingSize;
        delete self.capitalized;
        delete self.toSetting;
    };
    return self;
}

我是这样注册的:

ko.components.register('title', {
    viewModel: toTitle,
    template: '<select data-bind="options:$root.sizes, value: data.headingSize"></select><div data-bind="html:headerText"></div>'
});

我添加了一个按钮来“保存”设置,该按钮在页面底部显示将保存的内容。

http://jsfiddle.net/1kfvesq3/3/

关于javascript - Knockout - 通过设置对象的属性来更改对象的 'subclass',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654560/

相关文章:

javascript - 我的 javascript 函数返回值时出现问题

javascript - 在 JavaScript 中评估屏幕阅读器的当前状态

javascript - 使用有效的字段分隔符输入框; knockout

javascript - 使用 Javascript 更改图像源

javascript - 如何使用 jQuery 将对象解析为 JSON?

c# - 如何在 Fluent-nHibernate 查询中指定单个属性(鉴别器)的类型/类。

python - 在 Python 中覆盖 "private"方法

c# - 将 LINQ to SQL 数据实体子类化 - 坏主意还是遗漏了什么?

javascript - 使用带有选项绑定(bind)的计算

javascript - 单击 kogrid 中的复选框时获取行数据