में लंबे समय तक चलने वाले लोड ऑपरेशन मैं काम करने की कोशिश कर रहा हूं कि लंबे समय तक चलने वाले लोड ऑपरेशन को चलाने के लिए सबसे अच्छी जगह Durandal का उपयोग कर रही है।डुरंडल
मैं क्या बता सकते हैं, डेटा लोड करने के लिए सामान्य सिफारिश ViewModel के activate
विधि है, जो है जो मैं आमतौर पर में है - कुछ की तरह:
viewModel.activate = function() {
var loadPromise = myService.loadData();
return $.when(loadPromise).then(function (loadedData) {
viewModel.data(data);
});
};
मुझे पता है कि अगर मैं नहीं लौटते यहां वादा करें, फिर आमतौर पर बाइंडिंग के साथ समस्याएं होती हैं - this question and answer indicates के रूप में।
हालांकि, activate
विधि में लंबे समय तक चलने वाले लोड ऑपरेशन को निष्पादित करने से लोड ऑपरेशन पूर्ण होने पर ऐप "फ्रीज" बनाता है। उदाहरण के लिए, अगर मेरा भार अब ऐसा कुछ था?
viewModel.activate = function() {
// All loads return a promise
var firstLoad = myService.loadFirstData();
var secondLoad = myService.loadSecondData();
var thirdLoad = myService.loadThirdDataWhichTakesAges();
return $.when(firstLoad, secondLoad, thirdLoad).then(function (one, two, three) {
viewModel.one(one);
viewModel.two(two);
viewModel.three(three);
});
};
इस परिदृश्य में, यूआरएल पृष्ठ लोड किया जा रहा है के अनुसार अपडेट कर रहा है, लेकिन पृष्ठ की सामग्री अभी भी पिछले पृष्ठ से पता चलता है (जो है जो मैं "फ्रीज़" मतलब)।
आदर्श रूप से, यह अच्छा होगा अगर यूआरएल नए पेज में बदलना चाहिए, और पेज सामग्री को भी नया पेज दिखाना चाहिए (भले ही उस पृष्ठ का डेटा अभी तक वापस नहीं किया गया हो)। फिर, जैसे-जैसे प्रत्येक लोड ऑपरेशन लौटाता है, पृष्ठ के प्रासंगिक भाग को अद्यतन मॉडल में बाध्य होने पर अपडेट किया जाना चाहिए।
क्या यह Durandal के अंदर इसे प्राप्त करने के लिए एक अनुशंसित तरीका है?
मेरे वर्तमान समाधान गेंद मारना करने के लिए लोड activate
विधि में, और उसके बाद viewAttached
विधि में डेटा को पॉप्युलेट है:
var loadPromise;
viewModel.activate = function() {
// All loads return a promise
var firstLoad = myService.loadFirstData();
var secondLoad = myService.loadSecondData();
var thirdLoad = myService.loadThirdDataWhichTakesAges();
loadPromise = $.when(firstLoad, secondLoad, thirdLoad);
// Don't return the promise - let activation proceed.
};
viewModel.viewAttached = function() {
$.when(loadPromise).then(function (one, two, three) {
viewModel.one(one);
viewModel.two(two);
viewModel.three(three);
});
};
यह लगता काम करने के लिए है, लेकिन मुझे याद है पढ़ने कहीं कि viewAttached
पर भरोसा करना अच्छा समाधान नहीं था। मुझे यह भी यकीन नहीं है कि दौड़ की स्थिति के लिए संभावित है या नहीं, क्योंकि मैं सक्रियण को आगे बढ़ने की अनुमति दे रहा हूं।
कोई अन्य सिफारिशें?
सामान्य रूप से, मेरे एसपीए अनुप्रयोगों के लिए मैं "लोडिंग" टेक्स्ट और gif के साथ एक पारदर्शी div बना देता हूं। यह div पूरे पृष्ठ पर ओवरले किया गया है, ताकि उपयोगकर्ता फ़ीड प्राप्त कर सकें कि एप्लिकेशन कुछ करने का प्रयास कर रहा है लेकिन साथ ही साथ वे किसी अन्य चीज़ पर क्लिक करने में सक्षम नहीं होना चाहिए या कुछ पेज डेटा मैनिप्ल्यूशन नहीं करना चाहिए जबकि मेरा पृष्ठ है नेविगेट किया जा रहा है। आप एक सामान्य सेवा बना सकते हैं जो किसी भी दृश्य को नेविगेशन शुरू होने से पहले कॉल कर सकता है और नेविगेशन समाप्त होने के बाद div को हटा सकता है। – Yogesh
धन्यवाद @ योगेश, मैं कुछ ऐसा ही करता हूं - हालांकि मैं पूर्ण पृष्ठ ओवरले से बचने की कोशिश करता हूं क्योंकि वे मोबाइल उपकरणों पर अच्छा प्रदर्शन नहीं करते हैं। – gerrod