我有一个像这样定义的knockoutjs viewmodel:
function TestViewModel() {
var self = this;
self.matches = ko.observableArray([]);
self.selectedItem = ko.observable(self.matches()[0]);
self.SelectMatch = function (match) {
self.selectedItem(match);
};
self.setMatchList = function (_data) {
self.matches(_data);
};
}
我还有一个使用直接javascript从click事件调用的函数 - 没有涉及knockoutjs数据绑定。该脚本从服务器中检索JSON数组,如下所示:
$.ajax({
type: 'post',
contentType: "application/json; charset=utf-8",
url: "/FindMatches",
timeout: 10000,
data: JSON.stringify({ firstname: $("#Person_ProperFirstname").val(), lastname: $("#Person_ProperLastname").val(), gender: $("#Person_Gender").val().substring(0, 1) }),
success: function (results) {
if (results.length < 1) {
//setErrorMessage("No matches were found.");
}
else {
//setErrorMessage("");
$.each(results, function (item) {
TestViewModel.matches.push(item);
});
$("#parent_dialog").dialog("open");
}
现在我想更新我的viewmodel上的匹配observableArray,并从服务器返回结果,但我无法弄清楚如何执行此操作。除了你在上面的脚本中看到的,我还尝试了以下内容:
else {
TestViewModel.matches(results);
}
//also this
else {
TestViewModel.setMatchList(results); }
非常感谢任何帮助。
答案 0 :(得分:3)
我假设您的代码使用类似于:
的行初始化您的ko绑定 ko.applyBindings(new TestViewModel(data.d));
如果要创建模型实例的变量,可以在其他代码中引用它。
var _tvm = new TestViewModel(data.d);
ko.applyBindings(_tvm);
然后你的ajax结果将会是这样的:
else {
_tvm.matches(results);
}
这可能不完全正确,但应该让你接近......
答案 1 :(得分:0)
我认为数据是一个对象,你需要它作为一个数组。我已经使用mapping plugin轻松地为我做了转换:
$.getJSON('/casestudies', function(data) {
vm.casestudies = ko.mapping.fromJS(data);
ko.applyBindings(vm);
});
另外,对于您的示例,您必须手动执行映射:
$.each(results, function (item) {
TestViewModel.matches.push(item);
});
上面的项仍然是一个对象,所以你还需要预先知道项目的属性并将其映射到你的ko模型,看看ko's json page:
// Load and parse the JSON
var someJSON = /* Omitted: fetch it from the server however you want */;
var parsed = JSON.parse(someJSON);
// Update view model properties
viewModel.firstName(parsed.firstName);
viewModel.pets(parsed.pets);