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
Кодът, който публикувахте, точен ли е, че не връщате нищо? И каква версия на Durandal използвате? Освен това казахте, че изчаква, докато разговорът приключи, изчаква какво?   -  person CodingGorilla    schedule 10.09.2013
comment
Поставих пълния изгледмодел ;) (И използвам 2.0)   -  person iBoonZ    schedule 10.09.2013
comment
Все още не съм наясно какво мислите, че чака, вашият метод за активиране не връща нищо, следователно няма какво да чака Durandal. Искате да кажете, че целият изглед не се изобразява, докато заявката за 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)); Но в метода activatie имам около 6 метода за получаване на данни, така че как мога да използвам връщането тогава? Ако го използвам, останалите няма да бъдат изпълнени - person iBoonZ; 11.09.2013

Soo PW Kad, ти ме накара да се замисля, потърсих http модула и видях следното нещо:

get: function (url, query, type, header) { return $.ajax(url, { data: query, headers: { 'Authorization': header }, dataType: "json", crossDomain: true, type: type, async : невярно, }); },

ASYNC: FALSE

въздишка :)

Благодаря за гуменото пате момчета :)

person iBoonZ    schedule 10.09.2013