Дочерний объект JSON не определен, когда его нет - PullRequest
1 голос
/ 26 февраля 2012

У меня есть массив объектов JSON в исходном коде страницы, которые все работают, кроме дочернего объекта (категории).

Вот код в cshtml:

      <script type="text/javascript">
var initialData = @Html.Raw(Json.Encode(ViewBag.OfferItems));
</script>

Вот результирующий источник страницы:

       <script type="text/javascript">
var initialData = [{"Id":1,"Name":"Item1","ProductVariantLinks":[{"category":{"Id":2,"Name":"Basic Pizza","Products":null},"product":{"Id":1,"Name":"Margherita","Description":null,"ProductVariants":null},"productVariant":{"Id":1,"Name":"10 inch"}},{"category":{"Id":2,"Name":"Basic Pizza","Products":null},"product":{"Id":2,"Name":"Zeno","Description":null,"ProductVariants":null},"productVariant":{"Id":4,"Name":"8 inch"}}]},{"Id":2,"Name":"Item2","ProductVariantLinks":[]}];
</script>

Насколько я могу судить, категория есть и содержит свойства, но она выглядит неопределенной в отладчике IE.

IE Debugger showing category undefined

Есть что-то, что я пропускаю?

P.S. JSON действителен.

Обновление

Я использую knockoutjs, а категория находится в inialdata до тех пор, пока она не сделает ko.applybindings. Я не уверен, почему это будет сделано, код ниже:

/// <reference path="jquery-1.5.1.js" />
/// <reference path="knockout-2.0.0.js" />
var ProductVariantLink = function() {
    var self = this;
    self.category = ko.observable();
    self.product = ko.observable();
    self.productVariant = ko.observable();

    // Whenever the category changes, reset the product selection
    self.category.subscribe(function() {
        self.product(undefined);
        self.productVariant(undefined);
    });
};

var OfferItem = function() {
    var self = this;
    self.Name = new String();
    self.ProductVariants = new Array();
};

var SpecialOfferItemModel = function (specialOfferItems) {
    var self = this;
    self.specialOfferItems = ko.observableArray(ko.utils.arrayMap(specialOfferItems, function (specialOfferItem) {
        return { Id: specialOfferItem.Id, Name: specialOfferItem.Name, ProductVariants: ko.observableArray(specialOfferItem.ProductVariantLinks) };
    }));

    self.addSpecialOfferItem = function () {
        self.specialOfferItems.push({
            Id: "",
            Name: "",
            ProductVariants: ko.observableArray()
        });
    };

    self.removeSpecialOfferItem = function (specialOfferItem) {
        self.specialOfferItems.remove(specialOfferItem);
    };

    self.addProductVariant = function (specialOfferItem) {
        specialOfferItem.ProductVariants.push(new ProductVariantLink());
    };

    self.removeProductVariant = function (ProductVariant) {
        $.each(self.specialOfferItems(), function () { this.ProductVariants.remove(ProductVariant) })
    };

    self.save = function () {
        var OfferItems = new Array();
        $.each(self.specialOfferItems(),
                function () {
                    var item = this;
                    var offer = new OfferItem();
                    offer.Name = item.Name;
                    $.each(item.ProductVariants(),
                    function () {
                        offer.ProductVariants.push(this.ProductVariant);
                    });
                    OfferItems.push(offer);
                });
                self.lastSavedJson(JSON.stringify(ko.toJS(self.specialOfferItems()), null, 2));
        return false;
    };

    self.lastSavedJson = ko.observable("");
};
var model = new SpecialOfferItemModel(initialData);
ko.applyBindings(model);
$(function () {
    $('#myForm').submit(function () {
        model.save();
    });
});



<table class="specialOfferItemsEditor">
        <tr>
            <th>
            </th>
            <th>
                Name
            </th>
            <th>
                ProductVariants
            </th>
        </tr>
        <tbody data-bind="foreach: specialOfferItems">
            <tr>
                <td>
                    <div>
                        <a href="#" data-bind="click: $root.removeSpecialOfferItem">Delete</a></div>
                </td>
                <td>
                    <input data-bind="value: Name" />
                </td>
                <td>
                    <table>
                        <tr>
                            <th>
                                Category
                            </th>
                            <th>
                                Product
                            </th>
                            <th>
                                ProductVariant
                            </th>
                        </tr>
                        <tbody data-bind="foreach: ProductVariants">
                            <tr>
                                <td>
                                    <select data-bind='options: ProductCategories, optionsText: "Name", optionsCaption: "Select...", value: category, uniqueName: true'>
                                    </select>
                                </td>
                                <td data-bind="with: category">
                                    <select data-bind='options: Products, optionsText: "Name", optionsCaption: "Select...", value: $parent.product, uniqueName: true' >
                                    </select>
                                </td>
                                <td data-bind="with: product">
                                    <select data-bind='options: ProductVariants, optionsText: "Name", optionsCaption: "Select...", value: $parent.ProductVariant, uniqueName: true'
                                        >
                                    </select>
                                </td>
                                <td>
                                    <a href='#' data-bind='click: $root.removeProductVariant'>Delete</a>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <a href='#' data-bind='click: $root.addProductVariant'>Add Product Variant</a>
                </td>
            </tr>
        </tbody>
    </table>

1 Ответ

2 голосов
/ 26 февраля 2012

JSON приходит не так, как вы ожидаете. Я назначил строку JSON, которую вы указали выше, и мой отладчик IE смог найти «категорию» без проблем.

Снимок экрана: https://i.stack.imgur.com/cI60U.jpg

Попробуйте console.log (или alert) JSON.stringify(initialData);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...