使用获取的 json 对象淘汰 observablearray - 不填充我的视图模型

knockout observablearray with fetched json object - not populating my viewmodel

我第一次使用 Knockout(使用 v2.1.0)构建的外包应用程序。

虽然正在检索数据,但我似乎无法将获取的 json 对象放入我的视图模型中。我正在使用的代码非常大(我正在使用的这个特定的视图模型文件将近 1,700 行)。这是代码的精简版本:

var ViewModel = function(){
    var self = this;

    //a ton of other self.observables...

    //this is the part I'm trying to update with a new enhancedTiers (array of objects)
    self.medical = {
        //a bunch of other self.observables...
        enhancedTiers: ko.observableArray([])
    },

    //more self.observables...

    //down to the ajax success callback I'm working within
    success: function(data, textStatus, jqXHR) {
        ...
        switch (self.currentService()) {
            case "medical" :
                with (self.medical) {
                    //we set the existing observable data here...
                    //trying to set the NEW data
                    enhancedTiers(data.enhancedTiers);
                    console.log('***************************');
                    console.log(data.enhancedTiers);
                    console.log(data.enhancedTiers[0].name);
                    console.log(data.enhancedTiers[0].summaryBean.familyDedMet);
                    console.log('***************************');
                    //all these log out the correct data
                }
        }
        ...
    }

在我的 html 中,我正在执行以下操作以查看是否可以获得一些要输出的数据:

<span data-bind="text: medical.enhancedTiers()[0].name"></span>

我收到以下错误:

Uncaught Error: Unable to parse bindings.
Message: TypeError: Cannot read property 'name' of undefined;
Bindings value: text: medical.enhancedTiers()[0].name

如果我将 html 更改为:

<span data-bind="text: medical.enhancedTiers()[0]"></span>

UI 呈现 [object 对象]。

我也试过使用映射插件,但也无法正常工作。

我显然有来自 json 响应的数据,但是我似乎无法在视图模型中获取它。有人对如何将我返回的 json 数组对象放入我的视图模型有任何建议吗?

如果我将 enhancedTiers json 硬编码到我的视图模型中,我可以毫无问题地将 UI 绑定到该数据,只是我似乎无法将我的数据放入视图模型中。

这是因为视图是在您填充 observableArray 之前呈现的,所以当时这些字段不存在。您必须检查您的绑定,例如:

<span data-bind="text: medical.enhancedTiers().length > 0 ? medical.enhancedTiers()[0].name : ''"></span>