Javascript 当赋值延迟未发生时,将可观测数组绑定到视图

Javascript 当赋值延迟未发生时,将可观测数组绑定到视图,javascript,knockout.js,Javascript,Knockout.js,我有一个敲除可观察数组,它的值分配在一个设定的时间值之后发生变化,但在视图中看不到这一点。有人能告诉我哪里做错了吗?我希望输出能显示出来 •GRE 1111 •托福111 但它表明 •GRE2222 •TOEFL22 22 JSIDLE链接: HTML: console.clear(); 函数viewModel(){ this.plans=ko.observearray([]); 变量计划1=[ {id:'GRE',count:'1111'}, {id:'TOEFL',count:'111'}

我有一个敲除可观察数组,它的值分配在一个设定的时间值之后发生变化,但在视图中看不到这一点。有人能告诉我哪里做错了吗?我希望输出能显示出来

•GRE 1111 •托福111

但它表明

•GRE2222 •TOEFL22 22

JSIDLE链接:

HTML:

console.clear();
函数viewModel(){
this.plans=ko.observearray([]);
变量计划1=[
{id:'GRE',count:'1111'},
{id:'TOEFL',count:'111'},
];
变量计划2=[
{id:'GRE2',count:'222'},
{id:'TOEFL2',count:'22'},
];
这一点。计划=计划2;
//这一点。计划=计划1;
setTimeout(函数(){
console.log(“分配计划前超时”);
这一点。计划=计划1;
console.log(this.plans);
}, 2000);     
}
应用绑定(viewModel());
//上述行等于:
//viewModel();//更新窗口对象并返回null!
//ko.applyBindings();//将窗口对象绑定到主体


这里有几个问题。正如您在评论中提到的,您没有将对象与可观察对象绑定。您只需添加一个全局变量
plans
。如果knockout在viewModel中找不到属性,它将使用窗口对象的属性。这就是它第一次起作用的原因

  • 您需要将
    viewModel
    更改为构造函数,并使用
    newviewmodel()
    创建对象或实例
  • 应通过将可观察对象作为函数调用来实现。所以,
    this.plans(plans1)
    。如果您设置
    this.plans=plans2
    ,它将简单地用一个简单的数组覆盖可观察对象,而不需要订阅者在属性更改时更新UI
  • 您需要在内部使用
    setTimeout
    。通过在外部创建
    self=this
    变量或使用箭头函数作为回调函数
函数viewModel(){
this.plans=ko.observearray([]);
var plans1=[{id:“GRE”,计数:“1”},{id:“托福”,计数:“1”}];
var plans2=[{id:“GRE2”,count:“2”},{id:“TOEFL2”,count:“2”}];
this.plans(plans2)//像函数一样调用它
设置超时(()=>{
console.log(“分配计划前超时”);
本计划(计划1)
}, 2000);
}
ko.applyBindings(新的viewModel());//新建关键字以创建对象


这里有几个问题。正如您在评论中提到的,您没有将对象与可观察对象绑定。您只需添加一个全局变量
plans
。如果knockout在viewModel中找不到属性,它将使用窗口对象的属性。这就是它第一次起作用的原因

  • 您需要将
    viewModel
    更改为构造函数,并使用
    newviewmodel()
    创建对象或实例
  • 应通过将可观察对象作为函数调用来实现。所以,
    this.plans(plans1)
    。如果您设置
    this.plans=plans2
    ,它将简单地用一个简单的数组覆盖可观察对象,而不需要订阅者在属性更改时更新UI
  • 您需要在内部使用
    setTimeout
    。通过在外部创建
    self=this
    变量或使用箭头函数作为回调函数
函数viewModel(){
this.plans=ko.observearray([]);
var plans1=[{id:“GRE”,计数:“1”},{id:“托福”,计数:“1”}];
var plans2=[{id:“GRE2”,count:“2”},{id:“TOEFL2”,count:“2”}];
this.plans(plans2)//像函数一样调用它
设置超时(()=>{
console.log(“分配计划前超时”);
本计划(计划1)
}, 2000);
}
ko.applyBindings(新的viewModel());//新建关键字以创建对象