Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Foreach未正确更新视图_Javascript_Json_Knockout.js - Fatal编程技术网

Javascript Foreach未正确更新视图

Javascript Foreach未正确更新视图,javascript,json,knockout.js,Javascript,Json,Knockout.js,我正在努力让一个简单的单页应用程序正常工作。在检查了浏览器中的各种调试工具之后,我可以看到它正确地触发了搜索并以正确的格式返回了JSON。但是,foreach绑定似乎不会触发,并且该表永远不会填充 相关HMTL: IDDescriptionStatus 还有剧本: function WebticketViewModel() { // Data var self = this; self.folders = ['All', 'Open', 'Closed'];

我正在努力让一个简单的单页应用程序正常工作。在检查了浏览器中的各种调试工具之后,我可以看到它正确地触发了搜索并以正确的格式返回了JSON。但是,
foreach
绑定似乎不会触发,并且该表永远不会填充

相关HMTL:


IDDescriptionStatus
还有剧本:

function WebticketViewModel() {
    // Data
    var self = this;
    self.folders = ['All', 'Open', 'Closed'];
    self.chosenFolderId = ko.observable();
    self.chosenFolderData = ko.observable();
    self.chosenTicketData = ko.observable();

    // Behaviours    
    self.goToFolder = function(folder) { 
        self.chosenFolderId(folder); // Mark folder as selected
        self.chosenTicketData(null); // Stop showing a ticket
        $.get('search.php', { folder: folder }, self.chosenFolderData); // Fetch folder data and update view
    };

    self.goToTickets = function(ticket) { 
        self.chosenFolderId(ticket.folder); // Mark ticket as selected
        self.chosenFolderData(null); // Stop showing a folder
        $.get('search.php', { ticketID: ticket.id }, self.chosenTicketData); // Fetch ticket data and update view
    };

    // Show inbox by default
    self.goToFolder('All');
};

ko.applyBindings(new WebticketViewModel());

您使用可观察函数作为ajax调用的
success
回调。不要那样做。相反,使用适当的函数来处理结果。您已经在视图中期望了很多,因为
票据
似乎具有可观察的属性

为票证创建构造函数,如下所示:

function Ticket(data) {
  this.id = ko.observable(data.id);
  this.message = ko.observable(data.message);
  this.is_active = ko.observable(data.is_active);
}
并按照以下方式处理ajax调用:

$.get('search.php', { folder: folder }, function(data) {
  self.chosenFolderData({
    tickets: data.map(function(d) { return new Ticket(d); })
  });
});
下面是一个完整的演示:

//假数据:
$ = {
get:函数(url、数据、回调){
如果(data.folder&&data.folder==“All”){callback([{id:1,message:“My message AAAA”,处于活动状态:true}}}}}}
else if(data.folder&&data.folder==“Open”){callback([{id:1,message:“我的message bbbbbb”处于活动状态:false},{id:1,message:“我的message CCCC”,处于活动状态:true}}}}
else回调([]);
}
};
功能票(数据){
this.id=ko.可观察(data.id);
this.message=ko.observable(data.message);
this.is_active=ko.可观察(data.is_active);
}
函数WebticketViewModel(){
//资料
var self=这个;
self.folders=[“全部”、“打开”、“关闭”];
self.chosenFolderId=ko.observable();
self.chosenFolderData=ko.observable();
self.chosenTicketData=ko.observable();
//行为
self.goToFolder=函数(文件夹){
self.chosenFolderId(文件夹);//将文件夹标记为选中
self.chosenTicketData(null);//停止显示票据
$.get('search.php',{folder:folder},函数(数据){
self.chosenFolderData({
票证:data.map(函数(d){返回新票证(d);})
});
});//获取文件夹数据并更新视图
};
self.goToTickets=函数(票证){
self.chosenFolderId(ticket.folder);//将ticket标记为选中状态
self.chosenFolderData(null);//停止显示文件夹
$.get('search.php',{ticketID:ticket.id},self.chosenTicketData);//获取票证数据并更新视图
};
//默认情况下显示收件箱
self.goToFolder('All');
};
应用绑定(新的WebticketViewModel())
li:hover{cursor:pointer;color:red;}

IDDescriptionStatus
谢谢你的建议。我已经实现了您所做的更改,以及伪造的数据,页面功能正常。我仍然不确定如何删除假数据并让它引用我的真实JSON。解决了最后一步。无法正确猜测回调是JSON,因此必须在.get函数中显式声明。