击倒映射选项;将一个JSON属性映射到两个视图模型属性

Knockout mapping options; map a JSON property to two view model properties

本文关键字:属性 映射 两个 模型 视图 一个 选项 JSON      更新时间:2023-09-26

为了在发布/保存(可能)修改的视图模型到服务器时进行乐观的并发检查,我想在一个单独的变量中获取原始值的副本,而不是我用knockout绑定绑定到的可观察对象。

这是可能做与knockout映射插件,或者我必须迭代映射的可观察对象采取复制后,我已经填充视图模型?

这个怎么样?

function Task(data) {
    var self = this;
    self.title = ko.observable(data.title);
    self.origTitle = data.title;
    self.isDone = ko.observable(data.isDone);
    self.origIsDone = data.isDone;
    self.changes = ko.computed(function() {
        var changed = [];
        if (self.title() != self.origTitle) changed.push({ self.title(), self.origTitle });
        if (self.isDone() != self.origIsDone) changed.push({ self.isDone(), self.origIsDone });
        return changed;
    });
}
function TaskListViewModel() {
    // Data
    var self = this;
    self.tasks = ko.observableArray([]);
    self.newTaskText = ko.observable();
    self.changes = ko.computed(function() {
        var tasksToPost = ko.utils.arrayFilter(self.tasks(), function(task) { return task.changed().length > 0 });            
        $.ajax({
            type: 'POST',
            url: '/SomeUrl',
            data: tasksToPost 
        });
    });
    // Operations
    self.addTask = function() {
        self.tasks.push(new Task({ title: this.newTaskText() }));
        self.newTaskText("");
    };
    self.removeTask = function(task) { self.tasks.remove(task) };
    // Load initial state from server, convert it to Task instances, then populate self.tasks
    $.getJSON("/tasks", function(allData) {
        var mappedTasks = $.map(allData, function(item) { return new Task(item) });
        self.tasks(mappedTasks);
    });    
}
ko.applyBindings(new TaskListViewModel());