KnockoutJS和映射插件特定逻辑使用模板后续数据更新数据

时间:2012-04-13 22:44:52

标签: knockout.js knockout-mapping-plugin

这是一个两部分问题。

首先,我在模板绑定上使用了一个后跟器,以便在每次模板呈现新数据时完成一个动作。这工作正常......除了它工作得太正确。除非添加或删除数据,否则不会触发。

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

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

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

长话短说,我确信必须有一种方式来订阅属性,因为它正在更新?我想也许你只需要制作计算机可观察量?我打算把它扔到那里看看Ryan是否想要教我,因为他已经这么多次了:)。

1 个答案:

答案 0 :(得分: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/

这会足够吗?当值发生变化时,您想采取什么类型的行动?