-1

爲了在將(可能)已修改的視圖模型發佈/保存回服務器時進行樂觀併發檢查,我希望將原始值複製到單獨的變量中我可以觀察到的一個與knockout綁定綁定。挖空映射選項;將JSON屬性映射到兩個視圖模型屬性

這是可能與淘汰賽映射插件,或者我必須遍歷映射observables採取複製後填充視圖模型?

回答

0

這個怎麼樣?

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()); 
+0

謝謝,但那不是我要找的;我需要檢測單個值的變化 - 而不是數組。 – larsw

+0

再次看看你的問題,你有什麼理由讓他們在一個單獨的變量?這是否確定用戶是否已經單獨更改了該頁面上的任何內容?如果你使用映射器或不使用映射器,將涉及某種迭代 – Stokedout

+0

是的,我想a)只提交更改的值,但也b)配對新值和舊值,以便我可以做樂觀的併發檢查在服務器端。 – larsw