Angularjs - องค์ประกอบ ng-cloak / ng-show กะพริบ


231

ฉันมีปัญหาใน angular.js ด้วยคำสั่ง / คลาสng-cloakหรือng-showหรือ

Chrome ทำงานได้ดี แต่ Firefox ที่เป็นสาเหตุของการกระพริบขององค์ประกอบที่มีหรือng-cloak ng-showIMHO เกิดจากการแปลงng-cloak/ ng-showเป็นstyle="display: none;"อาจเป็นคอมไพเลอร์ javascript ของ Firefox ช้าลงเล็กน้อยดังนั้นองค์ประกอบจะปรากฏขึ้นชั่วขณะหนึ่งแล้วซ่อน

ตัวอย่าง:

<ul ng-show="foo != null" ng-cloak>..</ul>

1
หากคุณตั้งค่าการแสดง: ไม่มีสไตล์ในองค์ประกอบเหล่านี้ในตอนแรกมันจะแก้ไขปัญหาได้หรือไม่
akonsu

3
ฉันจะลองสิ่งนั้นฉันพยายามทำสิ่งที่คล้ายกันกับการเพิ่มคลาส (ซึ่งซ่อนองค์ประกอบ) จากนั้นลบมันออกด้วย js ด้วยตนเอง แต่มันก็ดูแย่กว่าเดิม
MelkorNemesis

คำตอบ:


385

แม้ว่าเอกสารไม่ได้กล่าวถึง แต่อาจไม่เพียงพอที่จะเพิ่มdisplay: none;กฎลงใน CSS ของคุณ ในกรณีที่คุณกำลังโหลด angular.js ในเนื้อหาหรือเทมเพลตที่ไม่ได้รวบรวมเร็วพอให้ใช้ng-cloakคำสั่งและรวมถึงต่อไปนี้ใน CSS ของคุณ:

/* 
  Allow angular.js to be loaded in body, hiding cloaked elements until 
  templates compile.  The !important is important given that there may be 
  other selectors that are more specific or come later and might alter display.  
 */
[ng\:cloak], [ng-cloak], .ng-cloak {
  display: none !important;
}

ดังที่ได้กล่าวไว้ในความคิดเห็น!importantสิ่งสำคัญคือ ตัวอย่างเช่นหากคุณมีมาร์กอัปต่อไปนี้

<ul class="nav">
  <li><a href="/foo" ng-cloak>{{bar}}</a></li>
</ul>

และคุณกำลังใช้bootstrap.cssงานอยู่ตัวเลือกต่อไปนี้เฉพาะเจาะจงมากขึ้นสำหรับng-cloakองค์ประกอบ 'ed ของคุณ

.nav > li > a {
  display: block;
}

ดังนั้นหากคุณรวมกฎง่ายๆdisplay: none;กฎของ Bootstrap จะมีความสำคัญกว่าและdisplayจะตั้งเป็นblockดังนั้นคุณจะเห็นการสั่นไหวก่อนที่แม่แบบจะรวบรวม


3
นอกจากนี้โปรดทราบว่าปัญหาเดียวกันนี้อาจเกิดขึ้นได้หากคุณกำลังโหลด angular.js โดยใช้ตัวโหลดแบบอะซิงโครนัสเช่น require.js เนื่องจากกฎ css ใน. js จะไม่ถูกแยกวิเคราะห์ในเวลา การแก้ปัญหาข้างต้นแก้ไขสถานการณ์นี้เช่นกัน
โยฮันน์

84
ไม่สามารถแก้ไขปัญหาให้ฉันได้ ไม่ทราบ - ฉันคิดว่าเบราว์เซอร์กระตือรือร้นที่จะแสดงสิ่งต่าง ๆ ในตอนแรก ...
Andriy Drozdyuk

7
เบราว์เซอร์ไม่ควรแสดงผล DOM โดยไม่คำนึงถึง css แม้ในรอบแรก ที่จะไม่มีประสิทธิภาพสูง; ตรวจสอบการตั้งค่าของคุณอีกครั้ง: p
AlexG

1
คุณจะบูต bootstrap dom ใหม่ที่ได้รับการปิดบังได้อย่างไรเมื่อคุณขี้เกียจโหลด doms ที่โมดูลรหัส?
FutuToad

หาก CSS ข้างต้นไม่ทำงานสำหรับโอกาสที่คุณมีของคุณ:ในng:cloakไม่ได้หนีออกมาได้อย่างถูกต้อง สำหรับ CSS ที่บริสุทธิ์ตรวจสอบให้แน่ใจว่ามีแบ็กสแลชอยู่ สำหรับ CSS [ng\\:cloak]รวบรวมเช่นสไตลัสก็จะเป็น ตรวจสอบ CSS ที่คอมไพล์แล้วเพื่อให้แน่ใจว่าถูกต้อง
Joe

47

ในฐานะที่เป็นที่กล่าวถึงในเอกสารคุณควรเพิ่มกฎเพื่อ CSS ของคุณที่จะซ่อนมันอยู่บนพื้นฐานของng-cloakแอตทริบิวต์:

[ng\:cloak], [ng-cloak], .ng-cloak {
    display: none;
}

เราใช้ลูกเล่นที่คล้ายกันในเว็บไซต์ "สร้างด้วยเชิงมุม" ซึ่งคุณสามารถดูแหล่งที่มาของบน Github ได้ที่: https://github.com/angular/builtwith.angularjs.org

หวังว่าจะช่วย!


4
angular.js เพิ่มกฎสไตล์นั้นไว้ที่ส่วนหัวของเอกสาร คุณไม่จำเป็นต้องเพิ่มสิ่งนี้ลงใน CSS ของคุณ ที่กล่าวมานี้ดูเหมือนว่าจะทำงาน ฉันเดาว่าเป็นเพราะ angular.js ไม่ได้เพิ่มบล็อกสไตล์ไว้ที่ส่วนหัวจนกระทั่งหลังจากโหลดเชิงมุม
พฤศจิกายน

13
อะไรจริงๆที่กล่าวถึงในเอกสารนี้คือ: "สำหรับผลที่ดีที่สุดสคริปต์ angular.js ต้องโหลดในส่วนหัวของไฟล์ HTML; ผลัดกฎ CSS (เหนือ) ต้องรวมอยู่ในสไตล์ภายนอกของแอพลิเคชัน "
Andriy Drozdyuk

4
กล่าวอีกนัยหนึ่งถ้าคุณกำลังเพิ่มการอ้างอิงสคริปต์ของคุณที่ด้านล่างของหน้าของคุณ (เป็นคนจำนวนมากทำ); จากนั้นเพิ่มกฎลงใน CSS ของคุณ
GFoley83

1
ฉันเพิ่ม angular.js ด้วย require.js ดังนั้นสิ่งนี้จึงช่วยฉันได้
โอลีฟ

1
เพิ่มคำสั่ง ng-cloak ให้กับองค์ประกอบ html ซึ่งเป็นคำสั่ง ng-app ทำงานเหมือนจับใจ ตัวอย่าง: <div ng-cloak ng-app = "my-app">
miniscem

33

ตรวจสอบให้แน่ใจว่า AngularJS รวมอยู่ในheadHTML ดูเอกสาร ngCloak :

เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดสคริปต์ angular.js จะต้องโหลดในส่วนหัวของไฟล์ html หรือมิฉะนั้นต้องรวมกฎ css (ด้านบน) ไว้ในสไตล์ชีทภายนอกของแอปพลิเคชัน


3
ใช่! ฉันไม่เข้าใจว่าเพราะเหตุใดผู้คนในทุกที่จึงแนะนำให้โหลด angular.js ที่ส่วนท้ายของหน้า ฉันรู้สึกดีขึ้นถ้า Angular ควบคุมได้ตั้งแต่ต้น ฉันng-cloakกำลังทำงานอยู่
Ivan Ferrer Villa

2
ฉันเห็นด้วย - สิ่งที่เกี่ยวกับสคริปต์ที่โหลดในตอนท้ายมาจากการพัฒนาเว็บปกติที่คุณต้องการให้หน้าเว็บแสดงบางสิ่งบางอย่างก่อนที่ js จะทำสิ่งนั้น แต่ในกรณีของมุมคุณต้องการย้อนกลับจริง ๆ
ดูคมชัดยิ่งขึ้น

1
และก่อนที่จะโหลดสไตล์ชีตใด ๆ การรวมแองกูลาร์ในheadแต่หลังจากที่รวมสไตล์ชีทไม่สามารถแก้ไขปัญหาได้
AgmLauncher

27

ฉันไม่เคยมีโชคมากที่ใช้ ngCloak ฉันยังคงกระพริบแม้จะมีทุกอย่างที่กล่าวไว้ข้างต้น วิธีเดียวที่หลีกเลี่ยงไม่ได้สะบัดคือการใส่เนื้อหาของคุณในแม่แบบและรวมถึงแม่แบบ ใน SPA HTML เดียวที่จะได้รับการประเมินก่อนที่จะรวบรวมโดย Angular คือหน้า index.html หลักของคุณ

เพียงนำทุกอย่างเข้าไปในร่างกายและติดไว้ในไฟล์แยกต่างหากจากนั้น:

<ng-include src="'views/indexMain.html'"></ng-include>

คุณไม่ควรริบหรี่เช่นนั้นเพราะ Angular จะรวบรวมเทมเพลตก่อนที่จะเพิ่มลงใน DOM


1
สิ่งที่ฉันใช้แน่นอน - สะอาดและเรียบง่ายไม่มีแฮ็กที่เจ็บปวด
Dmitri Zaitsev

2
โปรดทราบว่าng-includeจะส่งคำขอ AJAX เพิ่มเติมเพื่อดึงเนื้อหาจากเซิร์ฟเวอร์ ฉันเรียนรู้วิธีที่ยากที่คุณไม่ควรใช้ng-includeข้างในng-repeatเช่น
jsuddsjr

1
ทำงานให้ฉัน อย่าลืมเก็บไว้ng-appนอกng-includeมาร์กอัปของคุณ
GraehamF

2
วิธีนี้ใช้ได้ผลดีที่สุดโดยไม่มีอาการสะอึก ถ้าเป็นไปได้ใช้วิธีนี้
idungotnosn

2
วิธีนี้แก้ไขสถานการณ์ที่น่ารำคาญจริงๆ ขอบคุณ!
Maxwelll

22

ngBindและngBindTemplateเป็นทางเลือกที่ไม่ต้องการ CSS:

<div ng-show="foo != null" ng-cloak>{{name}}</div>  <!-- requires CSS -->
<div ng-show="foo != null" ng-bind="name"></div>
<div ng-show="foo != null" ng-bind-template="name = {{name}}"></div>

1
คำตอบที่ดีง่าย ng-bindเป็นวิธีที่ดีในการหลีกเลี่ยง 'flash brace flash' หรือต้องใช้ng-cloakในระดับแท็กแม้ว่าบางคนคิดว่ามันทำให้โค้ดอ่านน้อยลง สำหรับพวกเขาฉันไม่เห็นเหตุผลที่จะไม่ผสมผสานทั้งสองวิธีเข้าด้วยกัน
Dave Everitt

1
ng-bind เป็นวิธีการที่ดีกว่าในการแก้ปัญหาเนื่องจากคำตอบอื่น ๆ ต้องการให้คุณโหลดมุมแรกไม่ต้องใช้เครื่องมือจัดฟันแบบหยิกในทุกสถานการณ์
legramira

20

นอกจากคำตอบที่ยอมรับแล้วหากคุณใช้วิธีการอื่นในการกระตุ้น ng-cloak ...

คุณอาจต้องการเพิ่มความพิเศษเพิ่มเติมให้กับ CSS / LESS ของคุณ:

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
.ng-cloak, .x-ng-cloak,
.ng-hide {
    display: none !important;
}

1
สิ่งนี้ใช้ได้กับกรณีการใช้งานของฉันเมื่อไม่มีสิ่งใดที่กล่าวมาข้างต้นดูเหมือนจะทำงาน
Porlune

15

ฉันมีปัญหาที่คล้ายกันและพบว่าหากคุณมีคลาสที่มีการเปลี่ยนองค์ประกอบจะกะพริบ ฉันพยายามเพิ่ม ng-cloak ไม่สำเร็จ แต่ด้วยการลบการเปลี่ยนปุ่มหยุดกะพริบ

ฉันใช้อิออนเฟรมเวิร์กและโครงปุ่มมีการเปลี่ยนแปลงนี้

.button-outline {
  -webkit-transition: opacity .1s;
  transition: opacity .1s;
}

เพียงเขียนทับคลาสเพื่อลบการเปลี่ยนแปลงและปุ่มจะหยุดกระพริบ

ปรับปรุง

อิออนอีกครั้งมีการสั่นไหวเมื่อใช้ ng-show / ng-hide การเพิ่ม CSS ต่อไปนี้จะช่วยแก้ไข:

.ng-hide-add,
.ng-hide-remove {
  display: none !important;
}

ที่มา: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9


1
แต่นั่นจะไม่ปิดใช้งานภาพเคลื่อนไหวสำหรับคำสั่ง ng-hide / show ใช่ไหม
Kushagra Gour

1
ฉันจำไม่ได้ คุณลองแล้วมันปิดการใช้งานอนิเมชั่นเหรอ?
Seb Fanals

1
ขอบคุณ นี่เป็นปัญหาที่พิเศษมากสำหรับไอออนิก ฉันเพิ่มลง.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }ใน scss ของฉัน
hgoebl

9

ฉันมีปัญหาที่ไหน <div ng-show="expression">จะปรากฏเป็นครั้งแรกในเวลาเพียงเสี้ยววินาทีแม้ว่า "การแสดงออก" นั้นผิดพลาดในขั้นต้นก่อนที่คำสั่ง ng-show จะมีโอกาสวิ่ง

วิธีแก้ปัญหาที่ฉันใช้คือการเพิ่มคลาส "ng-hide" ด้วยตนเอง<div ng-show="expression" ng-hide>เพื่อให้แน่ใจว่ามันเริ่มถูกซ่อนในตอนแรก คำสั่ง ng-show จะเพิ่ม / ลบคลาส ng-hide ตามความจำเป็นหลังจากนั้น


1
ว้าวออกจากตัวเลือกที่ผิดทั้งหมดที่ฉันได้ลองมา ขอบคุณ!
Nikola

ทางออกที่ดีที่สุด! นี่ทำให้ฉันคลั่งไคล้หลายเดือน! ขอบคุณ!
abelabbesnabi

ฉันใช้อิออนเฟรมเวิร์กและนี่เป็นคำตอบเดียวที่ใช้งานได้จริง
มิเคล

7

ลองปิด FirebugFirebug ฉันจริงจัง สิ่งนี้จะช่วยในกรณีของฉัน

ใช้คำตอบที่ยอมรับแล้วตรวจดูให้แน่ใจว่าFirebugใน Firefox ของคุณปิดอยู่ : กด F12 จากนั้นปิด Firebug สำหรับหน้านี้ - ปุ่มเล็ก ๆ ที่มุมบนขวา


ใช่นั่นทำเพื่อฉันขอบคุณ!
MadeInDreams

ขอบคุณนั่นทำให้ฉันเป็นบ้า ข้อผิดพลาด
Stephen Simpson

6

จริงๆแล้วมีปัญหาสองอย่างที่แยกจากกันซึ่งอาจทำให้เกิดปัญหาการกะพริบ

ปัญหาที่ 1: ใช้เสื้อคลุม - สายเกินไป

ปัญหานี้ได้รับการแก้ไขเนื่องจากมีคำตอบมากมายในหน้านี้เพื่อให้แน่ใจว่ามีการโหลด AngularJS ไว้ในส่วนหัว ดูเอกสาร ngCloak :

เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดสคริปต์ angular.js จะต้องโหลดในส่วนหัวของไฟล์ html หรือมิฉะนั้นต้องรวมกฎ css (ด้านบน) ไว้ในสไตล์ชีทภายนอกของแอปพลิเคชัน

ปัญหาที่ 2: เอา ng-cloak ออกเร็วเกินไป

ปัญหานี้มักเกิดขึ้นเมื่อคุณมี CSS จำนวนมากบนหน้าเว็บของคุณโดยมีกฎเรียงซ้อนกันและ CSS ของเลเยอร์ที่ลึกขึ้นก่อนที่จะมีการใช้เลเยอร์ด้านบน

โซลูชัน jQuery ในคำตอบที่เกี่ยวข้องกับการเพิ่มstyle="display:none"องค์ประกอบของคุณจะแก้ปัญหานี้ตราบใดที่สไตล์ถูกลบออกช้าพอ (อันที่จริงแล้วโซลูชันเหล่านี้แก้ปัญหาทั้งสองได้) อย่างไรก็ตามหากคุณไม่ต้องการเพิ่มสไตล์ลงใน HTML ของคุณโดยตรงคุณสามารถใช้ผลลัพธ์เดียวกันได้ng-showได้

เริ่มต้นด้วยตัวอย่างจากคำถาม:

<ul ng-show="foo != null" ng-cloak>..</ul>

เพิ่มกฎ ng-show เพิ่มเติมให้กับองค์ประกอบของคุณ:

<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>

(คุณต้องng-cloakหลีกเลี่ยงปัญหา 1)

จากนั้นใน app.run ของคุณตั้งค่าisPageFullyLoaded:

app.run(['$rootScope', function ($rootScope) {
    $rootScope.$safeApply = function (fn) {
        $rootScope.isPageFullyLoaded = true;
    }
}]);

โปรดทราบว่าขึ้นอยู่กับสิ่งที่คุณกำลังทำ app.run isPageFullyLoadedอาจหรือไม่อาจจะเป็นสถานที่ที่ดีที่สุดในชุด สิ่งสำคัญคือการทำให้แน่ใจว่าการisPageFullyLoadedตั้งค่าเป็นจริงหลังจากสิ่งที่คุณไม่ต้องการกะพริบพร้อมที่จะเปิดเผยต่อผู้ใช้

ดูเหมือนว่า ปัญหา 1เป็นปัญหาที่ OP กำลังกดปุ่ม แต่คนอื่น ๆ พบว่าวิธีการแก้ปัญหาไม่ทำงานหรือทำงานเพียงบางส่วนเพราะพวกเขากำลังตีปัญหา 2แทนหรือดีกว่า

หมายเหตุสำคัญ:ต้องแน่ใจว่าใช้วิธีแก้ปัญหากับเสื้อคลุมทั้งสองที่ใช้งานช้าเกินไปและลบออกในไม่ช้า การแก้ไขปัญหาเหล่านี้เพียงข้อเดียวอาจไม่ช่วยบรรเทาอาการได้


1
นี้คงมันสำหรับฉัน"สคริปต์จะต้องโหลดในส่วนหัว"
aliopi

4

เราพบปัญหานี้ที่ บริษัท ของเราและแก้ไขมันด้วยการเพิ่ม "display: none" ใน CSS style สำหรับองค์ประกอบ ng-show ที่กระพริบ เราไม่ต้องใช้ NG-cloak เลย ซึ่งแตกต่างจากคนอื่น ๆ ในหัวข้อนี้เรามีประสบการณ์เรื่องนี้ใน Safari แต่ไม่ Firefox หรือ Chrome - อาจเนื่องมาจากข้อผิดพลาดของ Safari ทาสีขี้เกียจใน iOS7


3

สำหรับสิ่งที่คุ้มค่าฉันมีปัญหาที่คล้ายกัน ng-cloak ไม่ทำงาน อาจเป็นการตรวจสอบแอป / ไซต์ของคุณด้วยการเปิดใช้งานแคชเพื่อนำไฟล์ต้นฉบับมาใช้ใหม่เพื่อดูว่ามีประโยชน์หรือไม่

เมื่อรันไทม์ด้วยการกะพริบฉันกำลังทดสอบด้วย DevTools ที่เปิดอยู่และปิดใช้งานแคช การปิดพาเนลปิดโดยเปิดใช้งานการแคชช่วยแก้ไขปัญหาของฉัน



3

ฉันไม่สามารถใช้วิธีการเหล่านี้ได้ดังนั้นฉันจึงทำสิ่งต่อไปนี้ในที่สุด สำหรับองค์ประกอบที่คุณต้องการซ่อนในตอนแรก:

<div <!--...--> style="display: none;" ng-style="style">

จากนั้นในตัวควบคุมของคุณเพิ่มที่นี่หรือใกล้ด้านบน:

$scope.style = { display: 'block' };

วิธีนี้องค์ประกอบจะถูกซ่อนในตอนแรกและจะแสดงเฉพาะเมื่อรหัสคอนโทรลเลอร์นั้นทำงานจริง

คุณสามารถปรับตำแหน่งให้ตรงกับความต้องการของคุณหรืออาจเพิ่มตรรกะบางอย่าง ในกรณีของฉันฉันสลับไปยังเส้นทางการเข้าสู่ระบบหากไม่ได้เข้าสู่ระบบในปัจจุบันและไม่ต้องการให้อินเทอร์เฟซของฉันกะพริบล่วงหน้าดังนั้นฉันจึงตั้งค่า$scope.styleหลังจากการตรวจสอบการเข้าสู่ระบบ


2

มันเป็นเรื่องดีที่จะใช้แทนng-if ลบและสร้างองค์ประกอบใหม่ใน DOM อย่างสมบูรณ์และช่วยหลีกเลี่ยงการแสดง ng-กะพริบng-showng-if


แต่มันก็ยังทำลายปลั๊กอินที่ทำงานอยู่ในส่วนของ dom ... (เช่น jquery ui)
Geert Bellemans

2

ฉันใช้อิออนเฟรมเวิร์กการเพิ่มสไตล์ css อาจไม่ทำงานในบางสถานการณ์คุณสามารถลองใช้ ng-if แทน ng-show / ng-hide

ref: https://books.google.com.my/books?id=-_5_CwAAQBAJ&pg=PA138&lpg=PA138&dq=v&&&qq8vy&&&&& แหล่งที่มาของข้อมูล = onepage & q = NG-แสดง 20hide%%% 20flickering 20in% 20ios & F = false


2

คุณควรอ้างอิงเอกสารเชิงมุมดีกว่าเนื่องจากรุ่น [1.4.9] มีการอัปเดตเป็นด้านล่างซึ่งทำให้สามารถรองรับคำสั่ง data-ng-cloak

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}

2

ฉันลองใช้วิธีแก้ปัญหา ng-cloak ด้านบน แต่ก็ยังมีปัญหาเป็นระยะ ๆ กับ Firefox วิธีแก้ปัญหาเดียวที่ใช้งานได้สำหรับฉันคือการโหลดแบบฟอร์มล่าช้าจนกว่า Angular จะถูกโหลดจนเต็ม

ฉันเพิ่งเพิ่ม ng-init ในแอพและใช้ ng-if ที่ด้านรูปแบบเพื่อตรวจสอบว่าตัวแปรที่ฉันตั้งไว้โหลดแล้ว

<div ng-app="myApp" ng-init="loaded='yes'"> 
   <form ng-if="loaded.length > 0">
      <!--all my elements here-->
   </form>
</div>

1

นอกเหนือจากคำตอบอื่น ๆ หากคุณพบว่าแฟลชของรหัสเทมเพลตยังคงเกิดขึ้นเป็นไปได้ว่าคุณมีสคริปต์ที่ด้านล่างของหน้าเว็บและนั่นหมายความว่าคำสั่ง ng-cloak จะไม่ทำงาน คุณสามารถย้ายสคริปต์ของคุณไปที่ส่วนหัวหรือสร้างกฎ CSS

เอกสารกล่าวว่า "เพื่อผลลัพธ์ที่ดีที่สุดสคริปต์ angular.js จะต้องโหลดในส่วนหัวของเอกสาร html หรือมิฉะนั้นกฎ css ด้านบนจะต้องรวมอยู่ในสไตล์ชีตภายนอกของแอปพลิเคชัน"

ตอนนี้ไม่จำเป็นต้องเป็นสไตล์ชีทภายนอก แต่เป็นองค์ประกอบในส่วนหัว

<style type="text/css">
  .ng-cloak {
    display: none !important;
  }
</style>

แหล่งที่มา: https://docs.angularjs.org/api/ng/directive/ngCloak


1

ฉันลองทุกวิธีแก้ไขปัญหาที่โพสต์ที่นี่และยังคงกะพริบใน Firefox

ถ้ามันช่วยทุกคนฉันแก้ไขมันด้วยการเพิ่มstyle="display: none;"div เนื้อหาหลักจากนั้นใช้ jQuery (ฉันใช้มันในหน้านั้นอยู่แล้ว) $('#main-div-id').show();เมื่อทุกอย่างถูกโหลดหลังจากรับข้อมูลจากเซิร์ฟเวอร์


ฉันพบว่านี่เป็นวิธีเดียวที่ทำงานได้สำหรับฉัน แต่ฉันต้องการหลีกเลี่ยงการใช้ JQuery จึงพบทางเลือกอื่น ดูคำตอบของฉันที่นี่: stackoverflow.com/a/42527700/4214694
Andrew Downes

1

ฉันพบข้อเสนอแนะจากบันทึกการใช้เว็บของ Rick Strahlแก้ไขปัญหาของฉันได้อย่างสมบูรณ์แบบ (เนื่องจากฉันยังมีปัญหาแปลก ๆ กับ ng-cloak กระพริบ raw {{code}} ครั้งโดยเฉพาะอย่างยิ่งในขณะที่ใช้ Firebug):

ตัวเลือกนิวเคลียร์: การซ่อนเนื้อหาด้วยตนเอง

การใช้ CSS อย่างชัดเจนเป็นตัวเลือกที่ดีที่สุดดังนั้นจึงไม่จำเป็นต้องมีสิ่งต่อไปนี้ แต่ฉันจะพูดถึงที่นี่เนื่องจากให้ข้อมูลเชิงลึกเกี่ยวกับวิธีที่คุณสามารถซ่อน / แสดงเนื้อหาด้วยตนเองขณะโหลดสำหรับเฟรมเวิร์กอื่นหรือในเทมเพลตที่ใช้มาร์กอัปของคุณเอง

ก่อนที่ฉันจะค้นพบว่าฉันสามารถฝังสไตล์ CSS ลงในหน้าฉันได้พยายามคิดว่าทำไม ng-cloak ไม่ทำงาน หลังจากเสียเวลาหนึ่งชั่วโมงไปถึงไหนฉันก็ตัดสินใจซ่อนและแสดงภาชนะด้วยตนเอง แนวคิดนี้ง่าย - เริ่มแรกซ่อนคอนเทนเนอร์จากนั้นแสดงเมื่อ Angular ทำการประมวลผลเริ่มต้นและการลบมาร์กอัปเทมเพลตออกจากหน้า

คุณสามารถซ่อนเนื้อหาด้วยตนเองและทำให้สามารถมองเห็นได้หลังจาก Angular มีการควบคุม เมื่อต้องการทำสิ่งนี้ฉันใช้:

<div id="mainContainer" class="mainContainer boxshadow"
    ng-app="app" style="display:none">

สังเกตการแสดงผล: ไม่มีสไตล์ที่ซ่อนอิลิเมนต์ในหน้าเริ่มต้นอย่างชัดเจน

จากนั้นเมื่อ Angular เรียกใช้การเริ่มต้นและประมวลผลมาร์กอัปแม่แบบบนหน้าอย่างมีประสิทธิภาพคุณสามารถแสดงเนื้อหา สำหรับ Angular เหตุการณ์ 'พร้อม' นี้คือฟังก์ชัน app.run ():

app.run( function ($rootScope, $location, cellService) {        
    $("#mainContainer").show();
    
});

สิ่งนี้จะลบการแสดงผลอย่างมีประสิทธิภาพ: ไม่มีสไตล์และเนื้อหาจะปรากฏขึ้น เมื่อเวลา app.run () ยิง DOM ก็พร้อมที่จะแสดงด้วยข้อมูลที่กรอกหรืออย่างน้อยข้อมูลว่างเปล่า - Angular มีการควบคุม


ฉันพบว่านี่เป็นทางออกเดียวที่ทำงานได้สำหรับฉัน แต่ฉันต้องการหลีกเลี่ยงการใช้ JQuery จึงพบทางเลือกอื่น ดูคำตอบของฉันที่นี่: stackoverflow.com/a/42527700/4214694
Andrew Downes

1

ฉันลองคำตอบทั้งหมดข้างต้นแล้วก็ไม่ทำงานเลย การใช้ไอออนิกในการพัฒนาแอพไฮบริดและพยายามทำให้ข้อความแสดงข้อผิดพลาดไม่กะพริบ ฉันสิ้นสุดการแก้ไขปัญหาโดยเพิ่มคลาส ng-hide ในองค์ประกอบของฉัน div ของฉันมี ng-show แสดงองค์ประกอบเมื่อมีข้อผิดพลาด การเพิ่ม ng-hide ให้ตั้งค่า div เป็นไม่แสดงก่อนที่จะโหลดเชิงมุม ไม่จำเป็นต้องสวมเสื้อคลุมหรือเพิ่มมุมเข้าที่ศีรษะ


1

จากการสนทนาข้างต้น

[ng-cloak] {
                display: none;
            }

เป็นวิธีที่สมบูรณ์แบบในการแก้ปัญหา


1

ฉันใช้ ng-show ในคำสั่งเพื่อแสดงและซ่อนป๊อปอัป

<div class="..." ng-show="showPopup">

ไม่มีข้อใดถูกใช้งานได้สำหรับฉันและการใช้ ng-if แทนที่จะเป็น ng-show จะเป็น overkill นั่นหมายความว่าจะลบและเพิ่มเนื้อหาป๊อปอัปทั้งหมดใน DOM ทุกคลิกเดียว แต่ฉันเพิ่ม ng-if ลงในองค์ประกอบเดียวกันเพื่อให้แน่ใจว่าไม่ได้แสดงที่การโหลดเอกสาร:

<div class="..." ng-show="showPopup" ng-if="popupReady">

หลังจากนั้นฉันเพิ่มการเริ่มต้นลงในคอนโทรลเลอร์ที่รับผิดชอบคำสั่งนี้ด้วยการหมดเวลา:

$timeout(function () {
    $scope.popupReady = true;
});

วิธีนี้ฉันกำจัดปัญหาการกะพริบและหลีกเลี่ยงการแทรก DOM ในราคาแพงทุกการคลิก นี่เป็นค่าใช้จ่ายในการใช้ตัวแปรขอบเขตสองตัวสำหรับวัตถุประสงค์เดียวกันแทนที่จะเป็นหนึ่งเดียว แต่จนถึงตอนนี้นี่เป็นตัวเลือกที่ดีที่สุด



1

วิธีการแก้ปัญหาที่กล่าวข้างต้นไม่ได้ผลสำหรับฉัน จากนั้นฉันตัดสินใจที่จะดูฟังก์ชั่นที่เกิดขึ้นจริงและตระหนักว่าเมื่อ "$ scope.watch" ถูกไล่ออกมันก็ใส่ค่าลงในช่องชื่อที่ไม่ได้ตั้งใจ ดังนั้นในรหัสที่ฉันตั้งและเก่ามูลค่าและใหม่มูลค่าแล้ว

$scope.$watch('model.value', function(newValue, oldValue) {
if (newValue !== oldValue) {
validateValue(newValue);
}
});

เป็นหลักเมื่อมีการใช้งาน scope.watch ในกรณีนี้ AngularJS จะตรวจสอบการเปลี่ยนแปลงตัวแปรชื่อ (model.value)


0

ฉันจะห่อ<ul>ด้วย<div ng-cloak>


2
<ul>เขาไม่ควรจะต้องห่อ ng-cloakจะปิดบังองค์ประกอบใดก็ตามที่นำไปใช้รวมถึงลูกหลานขององค์ประกอบนั้น
btford

0

ผมเองตัดสินใจที่จะใช้แอตทริบิวต์มากกว่าng-class ng-showฉันประสบความสำเร็จมากขึ้นในการดำเนินการตามเส้นทางนี้โดยเฉพาะอย่างยิ่งสำหรับหน้าต่างป๊อปอัปที่ไม่ได้แสดงตามค่าเริ่มต้นเสมอ

สิ่งที่เคยเป็น <div class="options-modal" ng-show="showOptions"></div>

ตอนนี้: <div class="options-modal" ng-class="{'show': isPrintModalShown}">

ด้วย CSS สำหรับคลาส options-modal ที่เป็นdisplay: noneค่าเริ่มต้น คลาสการแสดงมีdisplay:blockCSS


-2

หลีกเลี่ยงการขึ้นบรรทัดใหม่

<meta http-equiv="Content-Security-Policy"              content="
default-src 'FOO';   
script-src 'FOO';    
style-src  'FOO'; 
font-src 'FOO';">

ทำงานได้กับ Firefox 45.0.1

<meta http-equiv="Content-Security-Policy"              content="    default-src 'FOO';    script-src 'FOO';     style-src  'FOO';    font-src 'FOO';">
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.