我正在尝试使用AJAX get在我的knockout应用程序中实现过滤,我想只更新viewmodel中众多observable中的一个。 这是我在JS中的viewmodel
function containerViewModel() {
mainViewModel = this;
mainViewModel.isBusy = ko.observable(false);
mainViewModel.errorMessage = ko.observable("");
mainViewModel.containerModel = ko.observable(
{
HomeSettings: ko.observable(),
Employee: ko.observable(),
Class: ko.observable(),
Degree: ko.observable(),
Specialization: ko.observable(),
}
);
GET_AllContainer(mainViewModel);
}
这些可观察对象中的每一个都显示在不同的标签中,每个标签都有过滤按钮。当我从任何选项卡单击过滤器按钮时,我使用ajax调用获取数据。但问题是我获取整个数据并绑定到viewmodel,因为这个
function GET_FilteredContainer(mainView, filterText, productID, FilterID) {
mainViewModel.isBusy(true);
$.ajax({
url: hostApi + api_GetAllContainer,
contentType: "json",
data: { FilterLinkIds: filterText, ProductID: productID },
success: function (result) {
mainView.containerModel(result);
SetFilterButtonCSS(productID, FilterID);
ProductReportsNotFound(result);
mainViewModel.isBusy(false);
},
error: function (result) {
mainViewModel.errorMessage(result);
mainViewModel.isBusy(false);
}
});
}
但这意味着它将清除其他标签的过滤器。那么有什么方法我只能更新所需的observable
任何人都可以帮助我。
答案 0 :(得分:1)
代码中有很多错误
mainView.containerModel(result)
是主要,您无法做到,因为它会替换整个可观察内容,因为它会取代您在声明中的可观察内容(containerModel
)而不是那些(你可能认为会这样)。
<强>视图模型:强>
var ViewModel = function () {
var self = this;
self.containerModel = ko.observable({
HomeSettings: ko.observable(),
Employee: ko.observable(),
Class: ko.observable(),
Degree: ko.observable(),
Specialization: ko.observable(),
});
var result = [{'HomeSettings':[1,2,3,4],'Employee':1}]
console.log("Object you getting at ajax call success")
console.log(result) //sample check
console.log("correct way1 o/p")
self.containerModel().HomeSettings(result[0].HomeSettings);
self.containerModel().Employee(result[0].Employee);
//like that for everything i.e see console everything is a function
console.log(self.containerModel())
};
ko.applyBindings(new ViewModel());
示例工作小提琴 here
PS:建议的方式就是在外面写一个函数并声明你可以观察到它。稍后您可以使用.map
或mapping plugin
以灵活的方式对containerModel observable进行分配