【问题标题】:Can ko.mapping gracefully wrap getters and setters?ko.mapping 可以优雅地包装 getter 和 setter 吗?
【发布时间】:2016-05-22 12:47:26
【问题描述】:

我正在将 Knockout 与 TypeScript 相结合。考虑这个例子:

class Person
{
    public FirstName:string = "John";
    public LastName: string = "Doe";

    public get FullName(): string
    {
        return this.FirstName + " " + this.LastName;
    }

    public set FullName(fullName: string): void
    {
        var names = fullName.split(" ");
        this.FirstName = names[0];
        this.LastName = names[1];
    }
}

翻译成:

var Person = (function()
{
    function Person()
    {
        this.FirstName = "John";
        this.LastName = "Doe";
    }

    Object.defineProperty(
        Person.prototype,
        "FullName",
        {
            get: function()
            {
                return this.FirstName + " " + this.LastName;
            },
            set: function(fullName)
            {
                var names = fullName.split(" ");
                this.FirstName = names[0];
                this.LastName = names[1];
            },
            enumerable: true,
            configurable: true
        });

    return Person;
})();

调查:

var mapped = ko.mapping.fromJS(new Person());
mapped.FirstName("Steve");
console.log("Want 'Steve Doe', was :", mapped.FullName()); //John Doe
mapped.FullName("John Travolta");
console.log("Want 'Travolta', was :", mapped.LastName()); //Doe

这根本不起作用。 是否可以让 ko.mapping 以通用的可重用方式理解 getter 和 setter?

【问题讨论】:

    标签: knockout.js typescript knockout-mapping-plugin


    【解决方案1】:

    您始终可以通过将 fullName 定义为计算函数来自己完成:

    var Person = function() {
      var self = this;
    
      self.firstName = ko.observable('John');
      self.lastName = ko.observable('Doe');
    
      self.fullName = ko.computed({
        read: function() {
          return self.firstName() + ' ' + self.lastName();
        },
        write: function(name) {
          if( name ) {
            var names = name.split(' ');
            self.firstName(names[0]);
            self.lastName(names[1]);
          }
        }
      });
    };
    

    对于复杂对象的 ko.mapper,我从来没有好运过,我更喜欢自己处理它,这真的不是很多工作。

    【讨论】:

    • 谢谢,我有一个包含很多类的复杂域模型,所以我希望能够以某种方式让 ko.mapping 自动执行此操作。
    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多