1

ko.mapping更新具有一些订阅的模型时出现错误。一旦订阅被删除,一切都会像魅力一样发挥作用。知道如何使它工作吗?

考虑这个例子(jsfiddle 可用) - 调用ko.mapping.fromJS()ininitModel()触发错误:

var iniData = {
    FirstName: "foo",
    LastName: "bar"
};

var PersonModel = function() {
    this.FirstName = ko.observable("");
    this.LastName = ko.observable("");
    this.FullName = ko.observable("");

    // If you comment out subscribe() calls, everything works fine!
    this.FirstName.subscribe(this.updateFullName);    
    this.LastName.subscribe(this.updateFullName);


    // Update FullName only if it's empty
    this.updateFullName = function(){
            if (!this.FullName()) {
                this.FullName(
                    this.LastName() + 
                            this.FirstName() ? (
                                " " + this.FirstName()
                            ):''
                );
            }

        };
    this.initModel = function(){
        try {
        ko.mapping.fromJS(iniData, {}, this);
        }
        catch(err) {
            alert(err.message);
        }
    }
}

ko.applyBindings(new PersonModel());
4

2 回答 2

1

updateFullName函数应放在您正在执行的两个订阅之前,否则JavaScript 解释器尚不知道此方法。像这样:

    var self = this;
    self.FirstName = ko.observable("");
    self.LastName = ko.observable("");
    self.FullName = ko.observable("");

    // Update FullName only if it's empty
    self.updateFullName = function(){
            if (!self.FullName()) {
                self.FullName(
                    self.LastName() + 
                            self.FirstName() ? (
                                " " + self.FirstName()
                            ):''
                );
            }

        };

    // If you comment out subscribe() calls, everything works fine!
    self.FirstName.subscribe(self.updateFullName);    
    self.LastName.subscribe(self.updateFullName);

另外,我认为在您的情况下,您应该避免订阅并将其声明FullName为计算的可观察对象,这实际上是完美的情况。这是如何做到的:

self.FirstName = ko.observable("");
self.LastName = ko.observable("");
self.FullName = ko.computed(function() {
  return self.LastName() + (self.FirstName() ? " " + self.FirstName() : "");
};

每当发生变化FirstNameLastName计算出的FullNameobservable 被更新时。


编辑:我检查了你的小提琴,另一个错误是在updateFullName函数中,“this”指的是方法的上下文,而不是你的视图模型的上下文。这解释了为什么fullName找不到该属性。检查更新的小提琴

于 2013-04-25T17:15:09.757 回答
0

计算出来的 observable 在这里不是更有意义吗?还是 fullName 值必须自己可编辑?

[编辑] 哎呀,Jalayn 更快;)

于 2013-04-25T17:18:30.997 回答