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

时间:2015-10-02 18:26:11

标签: 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 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获取所需数据,然后从{J}对象填充title Person属性,但从服务器返回的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。但是,通过单击按钮顶部显示错误消息。

请告诉我如何修复此错误? 问候

1 个答案:

答案 0 :(得分:0)

你的回调

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

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