Почему моя viewmodel обновляется в html, но не в моем javascript?

У меня есть функция, которая перемещает позицию на одну строку вверх за раз. Для простоты я показываю небольшую часть кода. Отображение моих наблюдаемых объектов в HTML, как и ожидалось, с использованием $ root.cRecordID, но в моем коде они не определены. Это сбивает с толку и расстраивает. Кто-нибудь может пролить свет?

listOrderUp: function (lid) {
    // get RecordID of selected item
    //viewModel.loadItemByID(lid);
    console.log(lid);

    OData.read(_serviceURL + "/nsLineItems(" + lid + ")?", function (response) {
        viewModel.cRecordID(response.RecordID);
        viewModel.cMenuID(response.MenuID);
        viewModel.cEntreeID(response.EntreeID);
        viewModel.cCategoryID(response.CategoryID);
        viewModel.cListOrder(response.ListOrder);
    });

    console.log(viewModel.cRecordID());

    // selected item - decrease ListOrder by 1
    var putdataCurrent = {
        RecordID: viewModel.cRecordID(),
        MenuID: viewModel.cMenuID(),
        CategoryID: viewModel.cCategoryID(),
        EntreeID: viewModel.cEntreeID(),
        ListOrder: viewModel.cListOrder() - 1
    };

    console.log(putdataCurrent);

    var _requestCurrent = {
        requestUri: _serviceURL + "/nsLineItems(" + viewModel.cListOrder() + ")",
        method: "MERGE",
        data: putdataCurrent
    };

    OData.request(_requestCurrent, function (data) {
    });
}

Вот результаты консоли: enter image description here

Вот мой тестовый код html:

Это отображает ожидаемый результат, но мне нужны результаты в моем коде, чтобы я мог сохранить данные на сервере. Как он может быть неопределенным в коде (файле javascript), но правильно отображается в html? Спасибо Джефф

0
0
42
2

Ответы 2

Я предполагаю, что OData.read(.....) - это асинхронный вызов сервера? Если это так, я считаю, что ваш код, который устанавливает значение в var putDataCurrent, выполняется до того, как вызов на сервер вернется. Если вы поместите пару точек останова, где вы установите результаты вызова для наблюдаемых и где вы установите putDataCurrent и проверьте, какая из них будет достигнута первой. Если это проблема, вы можете переместить свой код в обратном вызове «success» OData.read или, возможно, вы можете использовать обещания

Я получил желаемые результаты, встроив код REST в запрос OData:

listOrderUp: function (lid) {
    OData.read(_serviceURL + "/nsLineItems(" + lid + ")?", function (response) {
        viewModel.cRecordID(response.RecordID);
        viewModel.cMenuID(response.MenuID);
        viewModel.cEntreeID(response.EntreeID);
        viewModel.cCategoryID(response.CategoryID);
        viewModel.cListOrder(response.ListOrder);

        // selected item - decrease ListOrder by 1
        var putdataCurrent = {
            RecordID: viewModel.cRecordID(),
            MenuID: viewModel.cMenuID(),
            CategoryID: viewModel.cCategoryID(),
            EntreeID: viewModel.cEntreeID(),
            ListOrder: viewModel.cListOrder() - 1
        };

        console.log(putdataCurrent);

        var _requestCurrent = {
            requestUri: _serviceURL + "/nsLineItems(" + lid + ")",
            method: "MERGE",
            data: putdataCurrent
        };

        OData.request(_requestCurrent, function (data) {
        });
    });
    console.log(viewModel.cRecordID());
}

Другие вопросы по теме