Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJs将JSON obj绑定到嵌套的ViewModel,不要忽略ViewModel与JSON obj不对应的属性,并保留VM函数_Javascript_Json_Knockout.js - Fatal编程技术网

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

Javascript KnockoutJs将JSON obj绑定到嵌套的ViewModel,不要忽略ViewModel与JSON obj不对应的属性,并保留VM函数,javascript,json,knockout.js,Javascript,Json,Knockout.js,我在KnockoutJs中定义了一个嵌套的viewmodel,如下所示: function Person() { var self = this; self.title = ko.observable(""); self.someProp = ko.observable(false); self.someFunc = function() { self.someProp(false); }; } function viewMode

我在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获取所需数据,然后从JSON对象中填充
title
Person的
property,但从服务器返回的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>
通过使用此代码,顶部错误未显示,应用程序工作正常。通过调用
vm.loadPersonsData()
在另一个函数或事件中,成功地从服务器获取数据并绑定到html。但点击按钮顶部会显示错误消息

请告诉我如何修复这个错误? 问候您的回电

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

不是膨胀Person对象,而是附加数据,不是Person的实例在AJAX调用中,完全替换了self.someData的内容。看起来您想替换一些数据,但保留
someFunc
。你可以看看ko.mapping。好的,你已经正确地指出了问题所在,现在如果你能提到解决方案,那就太好了。与其在self.someData中添加response.someData,不如在self.someData中添加一个人
self.someData(Person())
。这将是一个没有数据的空的人,你也必须把它设定好。我知道回复,我只是在暗示:如果你用一个函数来编辑你的答案,这个函数实际上将显示它需要作为OP预期工作的代码,我会考虑投票你的答案而不是增加我的答案。现在你的答案是:“问题在这里,找出剩下的”。很明显,OP需要更好地理解JS中的OOP。
success: function (response) {
    self.someData(response.someData);                                       
}