0

这是一个两部分的问题。

首先,我在模板绑定上使用 afterrender 来完成每次模板呈现新数据时的操作。这工作正常......除了它工作得太正常了。除非添加或删除数据,否则它不会触发。

其次,为了解决第一个“问题”,我认为我需要编写自定义“更新”并检测数据是否已更改。这又是有道理的,但是我意识到映射中的更新函数也遵循“仅在添加或删除数据时运行”的想法。

所以我想我需要围绕映射模型的一个特定属性进行更新,例如:

var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function(options) {
        return new Person(options.data);
    },
    update: function(options) {
        // if first changed, doSomething();
        return options.target;
    },
    'first': {
        update: function(options) {
            // if first changed, doSomething();
            return options.target.first;
        }
    }   
};

但这只会变成一团糟,甚至不起作用。

如果你想检查一下,这里是FIDDLE 。

长话短说,我确定必须有一种方法可以在属性更新时订阅它?我想也许你只需要制作计算出的 observables?我要把这个扔出去,看看瑞恩是否想教我,因为他已经教过很多次了:)

4

1 回答 1

2

您也许可以解释您是否尝试完成一些不同的事情,但这是我将如何处理它:

我会使用手动订阅firstName并在那里执行我的操作。Person我会在你的构造函数中设置这个订阅。

就像是:

var Person = function(data) {
    this.id = data.id;
    this.first = ko.observable(data.first);
    this.last = ko.observable(data.last);
    this.full = ko.computed(function() {
        return this.first() + " " + this.last();
    }, this);    
    this.first.subscribe(function(newValue) {
         alert(this.full() + " had his/her first name changed");
    }, this);        
};

就像这个样本:http: //jsfiddle.net/rniemeyer/EDC7q/

这足够了吗?当值发生变化时,您希望采取什么类型的操作?

于 2012-04-14T00:17:45.937 回答