我有两个对象项目和设置我想要结合。 这适用于呈现数据。但是,当我想设置数据时(在这种情况下带有复选框),视图仅在第一次单击时响应。这是我的代码的简化版本:
Settings = function (data) {
var self = this;
self.settingsID = data.settingsID;
self.projectID = data.projectID;
self.isVisible = ko.observable(data.isVisible || true);
return self;
}
Project = function (data) {
var self = this;
self.projectID = data.projectID;
return self;
}
关键是projectID
我定义了以下函数(在多个视图模型中重用):
my = {
utils : {}
};
my.utils.getSettings = function (projectid, settings){
return ko.computed(function () {
return ko.utils.arrayFirst(settings(), function (s) {
return s.projectID === projectid;
});
});
};
在我的viewModel中,关系定义如下:
ViewModel = function (meID) {
self.selectedProject = ko.observable();
// some code setting the value of 'self.selectedProject'…
// settings
self.Settings = ko.observableArray();
$.ajax({
url: "/myService/GetSettingsByUserId",
data: "userID=" + meID,
dataType: 'json',
success: function (allData) {
self.Settings($.map(allData, function (item) {
return new Settings(item);
}));
}
});
self.getSettings = function (data) { return my.utils.getSettings(data.projectID, self.Settings) };
};
在我看来,我得到了这个HTML:
<div data-bind="with: selectedProject">
<div class="checkbox">
<label>
<input type="checkbox" data-bind="checked: $root.getSettings($data)().isVisible" />
<label>is Visible</label>
</label>
</div>
</div>
为什么第一次获得复选框更新? 我想这是因为无法通过&#39; my.utils.getSettings&#39;来更新Setting-object,但为什么呢? 我哪里出错了?