Javascript 从数据库表中成功删除项目后,我的视图不会更新。(带映射和jQuery的KnockoutJS)

Javascript 从数据库表中成功删除项目后,我的视图不会更新。(带映射和jQuery的KnockoutJS),javascript,html,knockout.js,knockout-mapping-plugin,Javascript,Html,Knockout.js,Knockout Mapping Plugin,我尝试了几种不同的方法,但是我没有成功地让视图更新其内容。我的视图包含客户的列表和员工的列表 这代表了我迄今为止所尝试的,将employees忽略为其基本上重复的代码 function dbControl() { var self=this; self.customers = function() { $.ajax(...) }; // returns customers object self.addCustomer = function() { $.ajax(...

我尝试了几种不同的方法,但是我没有成功地让视图更新其内容。我的视图包含
客户的列表
员工的列表

这代表了我迄今为止所尝试的,将
employees
忽略为其基本上重复的代码

function dbControl() {
    var self=this;
    self.customers = function() { $.ajax(...) }; // returns customers object 
    self.addCustomer = function() { $.ajax(...) };
    self.delCustomer = function() { $.ajax(...) };
}
var DB = new dbControl();

var VM = {};

// Populate the VM
VM.selCustomer = ko.observable();
VM.customers = ko.mapping.fromJS(DB.customers);
VM.addCustomer = function() {
    DB.addCustomer()                // successfully adds to Database
    VM.customers.push();            // push VM.selCustomer() into VM.customers
} 
VM.delCustomer = function() {
    DB.delCustomer()                // succcessfully removes from Database
    VM.customers.remove();          // removes VM.selCustomer() from VM.customers
}

// Knockout Binding
ko.applyBindings(VM);
data bind=“foreach:customers”
绑定在网页上运行良好,并列出所有条目

所有AJAX调用都成功地正确地从数据库中列出/添加/删除,但视图在成功删除后不会更新

我已尝试按照中的说明将
ko.mapping.fromJS(DB.customers,VM)
添加到VM中的delete函数的末尾:然后,每次从服务器接收新数据时,您都可以通过再次调用ko.mapping.fromJS函数一步更新viewModel上的所有属性,但没有成功

我已尝试将
VM.customers.valueHasMutated()
添加到VM,但它仍然没有更新

我已尝试创建一个间隔来运行之前的两次尝试:

setInterval(function() {
    VM.customers = [];
    VM.customers = ko.mapping.fromJS(DB.customers);
    VM.customers.valueHasMutated();
}, 1000);
我是不是把整个项目都安排错了

VM.addCustomer = function() {
  DB.addCustomer()                // successfully adds to Database
  VM.customers.push();            // push VM.selCustomer() into VM.customers
} 
VM.delCustomer = function() {
  DB.delCustomer()                // succcessfully removes from Database
  VM.customers.remove();          // removes VM.selCustomer() from VM.customers
}

您没有将任何内容传递给
推送
删除
observearray
的这两种方法肯定需要参数。取决于
DB
方法的编写方式,您可能会遇到相同的问题。

好的,在进行了更多的复制/粘贴之后,我想我已经解决了自己的问题:

视图没有更新的原因是来自数据库的数据从未被“重新调用”

为了解决这个问题,在VM中的add/delete函数中,我必须首先调用从服务器DB.getCustomers()提取数据的函数,然后进行ko.mapping.fromJS(DB.customers,{},VM.customers)调用

函数dbControl(){
var self=这个;
getCustomers=function(){
$.ajax({
/*URL/类型/数据/缓存/异步*/
成功:函数(){
self.customers=data;//现在,DB.customers==更新的数据!
}
}); 
}
}
var DB=new dbControl();
VM={};
VM.addCustomer=函数(){
DB.addCustomer()//成功添加到数据库

//VM.customers.push();您可以尝试
$.ajax({url:“yourURl”,cache:false});
@Degnome尝试过,但仍然没有更新。VM.customers应该在映射之前初始化为可观察数组吗?另外,添加/删除了
async:false
。两个都不成功。在其他项目中,我使用了$.load()只刷新列表容器。这仍然是一种合理的方法吗?我想避免在KnockoutJS宣称自己是“自我视图更新”时发出另一个GET/POST请求的潜在开销。我给出的代码片段只是一个示例,但是的,我理解你的意思。the.push()/.remove()按预期工作,但有没有办法单独使用ko.mapping.fromJS来实现这一点?成功从数据库中删除后,.remove()似乎是多余的。有谁能给我一些提示,让它异步运行(
async:true
)?现在,它必须等到DB.customers(
async:false
)在视图显示列表之前填充。
function dbControl() {
    var self = this;
    getCustomers = function() {
        $.ajax({
            /* URL/TYPE/DATA/CACHE/ASYNC */
            success: function() {
                self.customers = data; // Now, DB.customers == Updated Data!
            }
        }); 
    }
}

var DB = new dbControl();

VM = {};

VM.addCustomer = function() {
    DB.addCustomer()                // successfully adds to Database
    //VM.customers.push(); <------ Remove the redundancy
    DB.getCustomers();              // get the new list from the server
    ko.mapping.fromJS(DB.customers, {}, VM.customers);
} 
VM.delCustomer = function() {
    DB.delCustomer()                // succcessfully removes from Database
    //VM.customers.remove(); <------ Remove the redundancy
    DB.getCustomers();              // get the new list from the server
    ko.mapping.fromJS(DB.customers, {}, VM.customers);
}