在ajax获取后更新一个可淘汰的淘汰属性

时间:2015-08-17 09:56:51

标签: knockout.js knockout-mvc

我正在尝试使用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

任何人都可以帮助我。

1 个答案:

答案 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:建议的方式就是在外面写一个函数并声明你可以观察到它。稍后您可以使用.mapmapping plugin以灵活的方式对containerModel observable进行分配