Durandal Загружать данные, когда представление все еще загружается

В настоящее время у меня есть метод в методе активации, который получает данные из службы отдыха, проблема в том, что представление ожидает завершения обещания, как я могу загрузить представление И получить данные, не блокируя метод активации

var activate = function() {
     datacontext.PersonData().then(function(result) {
            name(result.person.firstName + " " + result.person.lastName);
            if (result.person.gender != undefined) {
                sex("(" + result.person.gender.substr(0, 1) + ")");
            }
            dob(generalFunctions.convertTimeStamp(result.person.birthDate, false));
            inss(result.person.inss);
        }); 
}

return { activate: activate }

Полный код -->

define(['durandal/app',
    'knockout',
    'core/config',
    'services/datacontext',
    'core/generalFunctions'],
function (app, ko, config, datacontext, generalFunctions) {
var name = ko.observable();
var sex = ko.observable();
var dob = ko.observable();
var inss = ko.observable();
var address = ko.observable();
var city = ko.observable();
var phone = ko.observable();
var personIsSelected = ko.observable(false);
var personIsNotSelected = ko.observable(false);
var activate = function (id) {
    config.isLoading(false);
    if (id == null) {
        if (config.selectedPatientId().length == 0) {
            personIsNotSelected(true);
            personIsSelected(false);
        } else {
            personIsNotSelected(false);
            personIsSelected(true);
        }
    } else {
        config.selectedPatientId(id);
        personIsSelected(true);
        personIsNotSelected(false);
    }
    config.pageTitle("Dashboard");
    setDashboardData();
};


var setDashboardData = function () {
    var id = config.selectedPatientId();
    //Fill basc patient data

    datacontext.patientBasicData(id).then(function(result) {
        name(result.person.firstName + " " + result.person.lastName);
        if (result.person.gender != undefined) {
            sex("(" + result.person.gender.substr(0, 1) + ")");
        }
        dob(generalFunctions.convertTimeStamp(result.person.birthDate, false));
        inss(result.person.inss);
    });

    //Fill adresss
    datacontext.patientAddress(id).then(function(result) {
        var firstAdress = result[0];
        address(firstAdress.street);
        city(firstAdress.zip + " " + firstAdress.municipality);
        phone(firstAdress.cellPhoneNumber);
    });


    //datacontext.medicationEntries(id).then(function (result) {
    //    console.log("medicationEntries");
    //    console.log(result);
    //});


    //datacontext.careElements(id).then(function (result) {
    //    console.log("CareElements");
    //    console.log(result);
    //});
};

var vm = {
    personIsSelected: personIsSelected,
    personIsNotSelected: personIsNotSelected,
    name: name,
    sex: sex,
    dob: dob,
    inss: inss,
    address: address,
    city: city,
    phone: phone,
    activate: activate,      

};

return vm;
});

person iBoonZ    schedule 10.09.2013    source источник
comment
Вы ничего не возвращаете из своей активации, поэтому он не должен ничего ждать. Что вы видите, что заставляет вас думать, что он ждет activate?   -  person CodingGorilla    schedule 10.09.2013
comment
Если я открою свои инструменты разработки Chrome и проверю вкладку сети (вызовы на сервер), я увижу, что Durandal ждет, пока вызов не завершится, если я добавлю, например, 5 вызовов, потребуется некоторое время, прежде чем представление загрузится.   -  person iBoonZ    schedule 10.09.2013
comment
Является ли код, который вы разместили, точным в том смысле, что вы ничего не возвращаете? А какую версию дюрандала используете? Кроме того, вы сказали, что он ждет, пока вызов не завершится, ждет чего?   -  person CodingGorilla    schedule 10.09.2013
comment
Я вставил полную модель просмотра ;) (И я использую 2.0)   -  person iBoonZ    schedule 10.09.2013
comment
Я до сих пор не понимаю, чего, по вашему мнению, он ожидает, ваш метод активации ничего не возвращает, поэтому дурандалу нечего ждать. Вы говорите, что все представление не отображается до тех пор, пока не завершится запрос ajax?   -  person CodingGorilla    schedule 10.09.2013
comment
Даш :(, он ждет, пока все не будет получено, например, если у меня есть 5 вызовов, он ждет, пока все 5 не закончатся   -  person iBoonZ    schedule 10.09.2013


Ответы (2)


Просто добавьте слово return перед вашим вызовом datacontext.PersonData(), и это должно немедленно показать представление... Единственный способ, который не сработает, - это если ваш datacontext.PersonData() ничего не возвращает, пока данные не будут был возвращен с сервера.

var person = ko.observable();

var activate = function() {
     return datacontext.PersonData(person); 
}

Если ваш PersonData - это то, что задерживает ваш вызов, затем передайте свое лицо или что-то еще в свой контекст данных и установите его при успешном вызове ajax.

var PersonData(person) = function () {
    return $.ajax(function () { // do some ajax call
                    success: function (data) {
                        person(data);
                    });
}
person PW Kad    schedule 10.09.2013
comment
dataContext.PersonData() действительно является вызовом ajax, который возвращает значение: return http.get(url, null, GET, getToken(config.username, config.password, GET, url)); Но в методе активации у меня есть около 6 методов для получения данных, так как же я могу использовать возврат? Если я использую его, остальное не будет выполнено - person iBoonZ; 11.09.2013

Итак, PW Kad, вы заставили меня задуматься, я заглянул в модуль http и увидел следующее:

get: function (url, query, type, header) { return $.ajax(url, {data: query, headers: {'Авторизация': header}, dataType: "json", crossDomain: true, type: type, async : ЛОЖЬ, }); },

АСИНХРОНИЗАЦИЯ: ЛОЖЬ

Вздох :)

Спасибо за резиновые нырки, ребята :)

person iBoonZ    schedule 10.09.2013