2

我现在面临一个问题。我有一个包含对象列表的可观察数组。每当我更新数组的任何对象的属性时。它不会反映在浏览器上。我使用了所有淘汰功能,如替换、删除。但是更新出现在可观察数组中,但不在浏览器中。

这是我的问题的示例:

 var ViewModel=new {
     self=this;
     self.List=ko.observableArray([]); 
              }
     $(function(){
       ko.applyBinding(ViewModel); 
    }) 
    $.post('/url',{},function(data){
        ViewModel.List(data); //data is list having 4 property having CommentList as again object-->id,title,description,CommentList--->commenttitle,commentdescription
      })  
    //During change of property of commentList
    $.post('/updateComment',{},function(obj){//Here obj-->obj.Commenttitle="some title",obj.commentdescription='some description'
       //Let say there require update 4th object of List and  2nd property of CommentList
         ViewModel.AnswerList()[4].CommentList.splice(2,1,obj);

     })
    //But nothing updation on browser
4

1 回答 1

3

你说:

每当我更新任何数组对象的属性时,它都不会反映在浏览器上。

可观察数组中对象的属性也需要设置为,ko.observable以便您的 UI 自动更新。

例如:

var anObservableArray = ko.observableArray([    
  { name: "A", type: "Type A" }    
]);

// some later point
anObservableArray()[0].name = "B";

不会更新您的 UI,因为它不是name可观察的。

然而,

var anObservableArray = ko.observableArray([    
  { name: ko.observable("A"), type: ko.observable("Type A") }    
]);

// some later point
anObservableArray()[0].name("B");

..将更新您的 UI 以将名称 B 显示为name可观察的。

编辑:(将代码添加到问题后)

所以从你的代码中你有:

 answer=GetAnswerFromViewModel(parentcourseItemID); 
 answer.CommentCount--;                     
 answer.CommentList.splice(CommentIndex,1); 
 answer.CommentText=''; 

假设GetAnswerFromViewModel返回具有可观察属性的答案,您应该编写:

 answer=GetAnswerFromViewModel(parentcourseItemID); 
 answer.CommentCount(answer.CommentCount()--);                     
 answer.CommentList.splice(CommentIndex,1); 
 answer.CommentText(''); 

如果您的答案中的属性不是可观察的,那么您的 UI 将不会更新。

于 2012-05-30T10:31:33.443 回答