2015-06-12 13 views
5

मैंने websockets, और vuejs का उपयोग करके एक वेब-ऐप बनाया है।websocket + vuejs: स्क्रीन झिलमिलाहट, दृश्य मूंछ कोड

डोम में मैं vuejs द्वारा प्रबंधित डेटा पर लूप करना चाहता हूं। वेबसाइकिल कनेक्शन स्थापित होने के बाद डेटा को बाद में टाइमलाइन में सेट किया गया है और डेटा प्राप्त हुआ है।

उस बिंदु तक (लगभग 0.5 सेकंड), आप साइट पर स्वयं के लिए मूंछ कोड देख सकते हैं, फिर इसे झिलमिलाहट और वास्तविक डेटा जोड़ना देखें।

मैं ViewModel, बनाते समय WebSocket कनेक्शन से डेटा प्राप्त, इस तरह:

onMessage: function (e) { 
    new Vue({ 
     el: '#messages', 
     data: { 
      messages: e.data 
     } 
    }); 
} 

क्या मैं पहले से ही पृष्ठ लोड पर ViewModels आरंभ किया गया था की कोशिश की, और बाद में डेटा सेट:

var vms = { 
    messages: new Vue({ 
     el: '#messages', 
     data: { 
      messages: { 
      } 
     } 
    }) 
}; 

WebSocket की onMessage घटना में:

var vm = vms.messages; 
vm.$data = { messages: body }; 

समस्या यह है कि, अभी भी देरी है, जब तक कि vm intialized नहीं है। अनुक्रम इस तरह है:

पृष्ठ लोड -> दिखाई मूंछें कोड -> मूंछें कोड छिपा हुआ है, क्योंकि डेटा एक खाली वस्तु पर सेट है -> वास्तविक डेटा के बाद यह WebSocket द्वारा प्राप्त है दिखाया गया है

कोई भी विचार/उस मामले पर सर्वोत्तम प्रथाओं?

+0

उपयोग एक classname स्थापित करने के लिए मूंछें, सभी लेकिन सीएसएस में है कि classname छिपाना। सीएसएस अन-इंटरप्लेटेड प्लेसहोल्डर को नहीं दबाएगा, और जब यह वास्तविक सीएसएस वर्ग में बदल जाएगा, तो यह छिपे रहेंगे। – dandavis

उत्तर

13

मैं जब तक मैं एपीआई दस्तावेज़ पढ़ ही समस्या है। यहां v-cloak directives का लिंक है!

HTML:

<div id="demo" v-cloak><p>{{ test }}</p></div> 

सीएसएस:

[v-cloak] {display: none} 
+0

क्षमा करें, मैंने नहीं देखा कि जेल पहले से ही सही समाधान पोस्ट कर चुका है :) – Greenny

+0

इस समस्या का सामना नहीं किया है, लेकिन यह नहीं होगा सुंदर सार्वभौमिक उम्मीद है कि मूंछ टैग हमेशा अदृश्य रहेंगे? यदि हां, तो 'v-cloak' डिफ़ॉल्ट क्यों नहीं होगा?मुझे पता है कि यह जवाब 1+ साल पहले है, लेकिन इसे वहां फेंक रहा है। –

1

दंडवीस की टिप्पणी के आधार पर, मैंने डीओएम की दृश्यता को टॉगल करने के लिए डीओएम, और v-class="hidden: !done" में एक "छिपी हुई कक्षा" (display: none) जोड़ा। done व्यूमोडेल के डेटा में एक प्रमुख-मूल्य जोड़ी है।

HTML:

<div class="message hidden" v-repeat="messages" v-class="hidden: !done">...</div> 

जावास्क्रिप्ट:

onMessage: function (e) { 
    new Vue({ 
     el: '#messages', 
     data: { 
      messages: e.data, 
      done: true 
     } 
    }); 
} 
+2

सुनिश्चित नहीं है कि छुपा सीएसएस वर्ग ओवरराइट करेगा। एक बेहतर समाधान सी-क्लोक (प्रदर्शन के साथ: कोई नहीं), और v-show = "done" का उपयोग करना होगा, सीएसएस वर्ग को टॉगल करने के बजाय। – Johannes

+4

वी-शो के साथ झुकाव के बाद मैं इसके बजाय वी-क्लोक पर बस गया। सबसे पहले अपने सीएसएस में [v-cloak] {display: none} का नियम सेट करें। फिर वी-क्लोक को किसी भी तत्व में जोड़ें जिसे आप छुपाएं जब तक कि वीएम लोड नहीं हो जाता है। http://vuejs.org/api/directives.html#v-cloak – jel

संबंधित मुद्दे