简体   繁体   English

仅从ko.observableArray发送更新的对象

[英]Sending only the updated object from ko.observableArray

How can I send only the updated model from an observable Array instead of sending the entire array? 如何仅从可观察数组发送更新的模型,而不发送整个数组?

var student = function (){
    this.studentId=0;
    this.firstName=ko.obserable();
    this.lastName=ko.obserable();
}
var course= function (){
    this.courseId=0;
    this.students=ko.obserableArray([]);
    this.Name=ko.obserable();
}

Now I want to get only that particular student from course whose info is updated. 现在,我只想从课程中获取该信息的特定学生。 Assuming that when we add a new class we can dynamically add new students to it on the go. 假设添加新课程时,我们可以在旅途中动态添加新学生。 Supposing that you have to validate the previous student before adding a new one. 假设您必须在添加新学生之前验证前一个学生。 When I get that particular student I want to send that student info back to the server. 当我收到那个特定的学生时,我想将该学生的信息发送回服务器。

Thanks. 谢谢。

If I understood your task right, you could use "arrayChange" event type to get exact changed (added/removed) items: 如果我理解您的任务正确,则可以使用“ arrayChange”事件类型来获取完全更改(添加/删除)的项目:

sourceArray = ko.observableArray();
sourceArray.subscribe(function (changes) {
        changes.forEach(function(arrayChange) {
            if(arrayChange.status === 'added') {
                // some code on add
            } else if(arrayChange.status === 'deleted') {
                // some code on delete
            }
        });
    }, null, "arrayChange");

If you want to get list of students which have been modified, you can provide a flag to identify if an object has been modified in student object. 如果要获取已被修改的学生的列表,则可以提供一个标志来标识对象是否已在学生对象中被修改。 Use .subscribe to modify that flag whenever a value is updated. 每当值更新时,请使用.subscribe修改该标志。 Then use ko.computed or ko.pureComputed to get that list. 然后使用ko.computedko.pureComputed获取该列表。

Also it supposes to be observable . 它也应该是observable

 var student = function (id, firstName, lastName) { var self = this; self.hasChanged = ko.observable(false); var modified = function(){ self.hasChanged(true); }; self.studentId = ko.observable(id); self.firstName = ko.observable(firstName); self.firstName.subscribe(modified); self.lastName = ko.observable(lastName); self.lastName.subscribe(modified); } var course= function (){ var self = this; self.courseId = 0; self.students = ko.observableArray([new student(1, "Cristiano", "Ronaldo"), new student(2, "Lionel", "Messi")]); self.modifiedStudent = ko.computed(function(){ return ko.utils.arrayFilter(self.students(), function(student) { return student.hasChanged(); }); }, self); self.Name = ko.observable("Programming 101"); } $(document).ready(function () { var myViewModel = new course(); ko.applyBindings(myViewModel); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> List of all students: <div data-bind="foreach: students"> <div> <span data-bind="text: studentId"></span> <input type="text" data-bind="value: firstName" /> <input type="text" data-bind="value: lastName" /> </div> </div> <br/> List of students which has been modified: <div data-bind="foreach: modifiedStudent"> <div> <span data-bind="text: studentId"></span> <input type="text" data-bind="value: firstName" readonly /> <input type="text" data-bind="value: lastName" readonly /> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM