Javascript 在敲除中将子(嵌套)视图模型设置为null
我已将viewModels定义如下:Javascript 在敲除中将子(嵌套)视图模型设置为null,javascript,knockout.js,Javascript,Knockout.js,我已将viewModels定义如下: var uiViewModel = { updateLive: ko.observable(true), sendEnabled: ko.observable(true) }; var JobViewModel = function () { this.ID = ko.observable(); this.EndedAt = ko.observable(); this.StartedAt = ko.observabl
var uiViewModel = {
updateLive: ko.observable(true),
sendEnabled: ko.observable(true)
};
var JobViewModel = function () {
this.ID = ko.observable();
this.EndedAt = ko.observable();
this.StartedAt = ko.observable();
};
var viewModel = {
ui: uiViewModel,
job: new JobViewModel()
};
ko.applyBindings(viewModel);
// Callback function from AJAX call
var _ResultLastJob = function (result) {
if (result.success) {
if (result.job == "null") {
// What happens if returned job object is null?
viewModel.job = null;
// OR reset the object
//viewModel.job.ID(null);
//viewModel.job.StartedBy("");
}
else {
var jobData = JSON.parse(result.job);
if (viewModel.job == null) {
// If job was null create a new one,
// however, this will not be bound to KO
var newJob = new JobViewModel();
viewModel.job = newJob;
}
ko.mapping.fromJS(jobData, {}, viewModel.job);
}
}
}
// Somewhere I call to get result, this is called periodically on the same page
$.get(url, _ResultLastJob);
我定期调用ajax函数来获取作业的值。在回调中,我将设置job的值。然而,在一些获取调用期间,我可以为作业视图模型获取null
值。处理这种情况的最佳方法是什么?我应该设置job=null
(然后我会丢失绑定的对象),还是需要手动重置视图模型值,并在UI中检测到没有为job
视图模型返回任何对象
还有其他办法解决这个问题吗?我是个新手
编辑:下面是定期获取期间的结果列表,我需要基于此更新视图模型 |Request | result | ------------------- | 1 | non-null | | 2 | non-null | | 3 | null | | 4 | null | | 5 | non-null | |请求|结果| ------------------- |1 |非空| |2 |非空| |3 |零| |4 |零| |5 |非空|
我可以建议您始终创建
JobViewModel
,但在ResultLastJob
方法中初始化它。当从服务器接收的数据为空时,JobViewModel
将使用默认值初始化。此解决方案的主要优点是视图上有一个逻辑(您不应该添加任何检查JobViewModel
是否不为null等):
显示您的视图模型的完整代码,对于我来说不清楚,您如何获取作业视图模型的数据!?视图模型在我发布时已完成。但是我已经为回调函数添加了代码,在这里我需要更新视图模型。谢谢你的回复。抱歉,我忘了提到我定期调用getJSON函数。因此,我可能在第三次或第四次通话中得到空值。在这种情况下,
init
需要重置所有字段。这就是我的问题,我必须手动重置每个字段,还是我可以只设置viewModel.job=null
。不,你不能设置viewModel.job=null
,你应该手动重置viewModel。除了重置所有属性,还有其他选择吗?
var UiViewModel = function() {
var self = this;
self.updateLive = ko.observable(true);
self.sendEnabled = ko.observable(true);
};
var JobViewModel = function () {
var self = this;
self.ID = ko.observable();
self.EndedAt = ko.observable();
self.StartedAt = ko.observable();
self.init = function(data) {
self.ID(data ? data.ID : null);
self.EndedAt(data ? data.EndedAt : null);
self.StartedAt(data ? data.StartedAt : null);
}
};
var viewModel = {
ui: new UiViewModel(),
job: new JobViewModel()
};
var _ResultLastJob = function (result) {
if (result.success) {
viewModel.job.init(result.job);
}
}