繁体   English   中英

KnockoutJs将JSON obj绑定到嵌套的ViewModel,并且不要忽略与JSON obj不对应的ViewModel属性,并保留VM函数

[英]KnockoutJs bind JSON obj to nested ViewModel and dont ignore ViewModel not corresponding properties to JSON obj and keep VM functions

我在KnockoutJs中定义了一个嵌套的viewmodel,如下所示:

function Person() {
    var self = this;
    self.title = ko.observable("");
    self.someProp = ko.observable(false);
    self.someFunc = function() {
        self.someProp(false);
    };    
}

function viewModel() {
    var self = this;

    self.someData = ko.observableArray([new Person()]);

    self.loadPersonsData = function() {
        $.ajax({
            type: "POST",
            url: '/GetAllPersons',
            dataType: "json",
            async: false,
            contentType: "application/json;charset=utf-8",
            data: JSON.stringify({"catId": selectedCategoryId }),
            success: function (response) {
                self.someData(response.someData);                                       
            }
    });
}

必需的数据从ajax获取,然后Person title属性从JSON对象填充,但是从服务器返回的JSON对象中不存在someProp属性。 然后应用绑定:

var vm;
$(function() {
    vm = new viewModel();    
    vm.loadPersonsData();    
    ko.applyBindings(vm);
});

以这种方式将视图绑定到html元素:

<section data-bind="foreach: someData">
    .
    .
    .
    <button data-bind="click: function(data, event) {  $data.someFunc(); event.stopPropagation(); }" type="button">other</button>
</section>

单击以显示以下错误消息:

TypeError:$ data.someFunc不是函数

然后我在应用绑定之前更改代码:

vm = new viewModel();    
vm.loadPersonsData();
$.each(vm.someData() , function(i, val) {         
    self.someProp = ko.observable(false);
    self.someFunc = function() {
        self.someProp(false);
    };    
});
ko.applyBindings(vm);

通过使用此代码,不会显示顶部错误,并且应用程序可以正常运行。 通过调用vm.loadPersonsData(); 在另一个函数或事件中,数据成功从服务器获取并绑定到html。 但是,通过单击按钮顶部显示了错误消息。

请告诉我如何解决此错误? 问候

您的回叫

success: function (response) {
    self.someData(response.someData);                                       
}

不是膨胀Person对象,而是附加数据,而不是Person的实例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM