1

私はノックアウト.jsをしばらく使用していますが、これまでこの問題に遭遇したことはありません. 通常、新しい js オブジェクトを observableArray にプッシュしようとすると、問題なく動作しますが、何らかの理由で、今回は次のエラーが発生します。

TypeError: self.Students.push is not a function

ここに私のコードのスニペットがあります:

window.ApiClient = {
    ServiceUrl: "/api/students",

    Start: function () {
        var viewModel = ApiClient.ViewModel(ngon.ClientViewModel);
        ko.applyBindings(viewModel);                
        viewModel.get();
    }    
};

ApiClient.ViewModel = function(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);    

    this.get = function (id) {
        if (id == undefined) {
            return ApiClient.Service.get(self.PageSize(), self.PageNumber(), function (data) {
                self.Students(data);
            });
        }
    }

    this.post = function () {        
        return ApiClient.Service.post(self.DetailedStudent, function (data) {                        
            self.Students.push(data);
        });
    }

    return this;
}

ApiClient.Service = function () {    
    var _get = function (pageSize, pageNumber, callback) {
        sv.shouldShowLoading = false;
        var queryParams = String.format("?pageSize={0}&pageNumber={1}", pageSize, pageNumber);        
        $.ajax(ApiClient.ServiceUrl + queryParams, {
            dataType: "json",
            type: "get",
            success: callback
        });
    }

    var _post = function (student, callback) {
        $.ajax(ApiClient.ServiceUrl, {
            data: ko.mapping.toJSON(student),
            type: "post",
            contentType: "application/json; charset-utf-8",
            statusCode: {
                201 /*Created*/: callback,
                400 /*BadRequest*/: function (jqxhr) {
                    var validationResult = $.parseJSON(jqxhr.responseText);
                    alert(jqxhr.responseText);
                }
            }
        });
    }

    return {        
        get: _get, 
        post: _post
    };
}();

$(document).ready(function () {    
    ApiClient.Start();      
});

私の学生オブジェクトは、Id、FirstName、LastName を持つ非常に単純な C# オブジェクトです。get() 関数は問題なく動作します。結果のデータをプッシュできないのは、post() からのコールバック関数だけです。また、サーバーから返されるデータは正しいように見えます。

{"Id":"rea","FirstName":"asdf","MiddleName":null,"LastName":"rrr"}
4

1 に答える 1

3

私はこれを解決しました!これは、ページのビュー モデル オブジェクトによってインスタンス化されたときに、最初のビューモデルがその Students プロパティに「null」を持っていたためです。

knockout.js では、自動マップされるすべてのフィールドに null 以外の値が必要です。

于 2013-02-02T03:16:21.477 に答える