webentwicklung-frage-antwort-db.com.de

So verhindern Sie, dass das Element vor der Initialisierung von AngularJS angezeigt wird (ng-show)

In AngularJS frage ich mich, wie man die auf der Seite gezeigten Elemente verhindern kann, bevor ng-show wirksam wird. Ich habe in einigen Beiträgen über ng-cloak gesprochen, aber es scheint in meinem Fall nicht zu funktionieren eher als Elementstil.

Ein anderer Weg, über den jemand spricht, definiert einen Stil für die Initialisierung von AngularJS, aber das ist schwer zu handhaben.

Gibt es einen offiziellen Weg, um damit umzugehen?

14
Kuan

Wenn Sie keinen Loader anzeigen möchten, sollte ng-cloak Ihre Lösung sein. 

Offizielle Dokumentation über Ng-Mantel

Wenn das Problem weiterhin besteht, können Sie versuchen, die Option css zum Ausblenden des Elements mit ng-cloak in Ihrer HTML-Datei hinzuzufügen, um sicherzustellen, dass der Browser es rechtzeitig hat.

Wenn Sie dies tun, wählen Sie auf dem Weg den ng-cloak . Fügen Sie ihn beispielsweise als Klasse hinzu:

<div ng-show="condition" class="ng-cloak">...</div>

Und fügen Sie dies in Ihren HTML-Tag ein:

<style> .ng-cloak { display: none !important; } </style>
22
Yoann

Wenn Sie einfach vermeiden möchten, dass etwas angezeigt wird, bis es angezeigt wird (einige Daten wurden möglicherweise vom Backend geladen), sollten Sie ng-if verwenden. Natürlich funktioniert es auch mit ng-show. Der Vorteil der Verwendung von ng-if besteht jedoch darin, dass Sie die Erstellung des zusätzlichen DOM so lange verzögern, bis es angezeigt werden muss. Dadurch wird die Ladezeit der ersten Seite verbessert.

Hier ist ein Beispiel:

var myApp = angular.module('myApp', []);


   
myApp.controller("myController", function ($scope, $timeout) {

    $scope.isLoading = false;
    $scope.data = null;
    
    simAsync();

    //simulate async task like http request
    function simAsync() {
        //loadind data has started
        $scope.isLoading = true;

        $timeout(function () {
            $scope.data = [{
                "firstname": "Sims",
                    "lastname": "Wilkerson"
            }, {
                "firstname": "Kelli",
                    "lastname": "Vazquez"
            }, {
                "firstname": "Mcdonald",
                    "lastname": "Byrd"
            }, {
                "firstname": "Taylor",
                    "lastname": "Frost"
            }, {
                "firstname": "Merle",
                    "lastname": "Adkins"
            }, {
                "firstname": "Garrett",
                    "lastname": "Hood"
            }];
            //the data has loaded
            $scope.isLoading = false;
        }, 1500);
    }

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myController">
    
</div>

5

Verwenden Sie einen Lader wie diesen:

JS

 angular.element(document).ready(function(){
      $('.loading').remove(); // Just an example dont modify the dom outside of a directive in a real app!
      alert('Loaded!'); 
    });

CSS

.loading {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #fff;
  color: #000;
}

DEMO

http://codepen.io/nicholasabrams/pen/MwOMNR

Ich habe gerade ein ähnliches Thema hier beantwortet: Registerkarte Angularjs Laden des Spinners während des Renderns

1
Alpha G33k

2 Alternativen, um das Problem vollständig zu vermeiden:

<span ng-bind="expression_without_braces"></span>

Es ist vorzuziehen, ngBind anstelle von {{ expression }} zu verwenden, wenn der Browser vorübergehend von seinem Browser im rohen Zustand angezeigt wird, bevor AngularJS es kompiliert. Da ngBind ein Elementattribut ist, werden die Bindungen für den Benutzer während des Ladens der Seite nicht sichtbar.

  • verwenden Sie ui-router , um HTML in separaten Dateien zu speichern, die nur dann geladen/analysiert werden, wenn sie benötigt werden und nur, wenn der Controller initialisiert wird.

Hier ist das Hallo Welt Tutorial modifiziert, um eine separate HTML-Datei zu verwenden:

// helloworld.js
var myApp = angular.module('helloworld', ['ui.router']);

myApp.config(function($stateProvider) {
  var helloState = {
    name: 'hello',
    url: '/hello',
    templateUrl: 'helloworld.html'
  }

  $stateProvider.state(helloState);
});
<!-- helloworld.html -->
<h3>hello world!</h3>
<!-- index.html -->
<html>
  <head>
    <script src="lib/angular.js"></script>
    <script src="lib/angular-ui-router.js"></script>
    <script src="helloworld.js"></script>
  </head>

  <body ng-app="helloworld">
    <a ui-sref="hello" ui-sref-active="active">Hello</a>

    <ui-view></ui-view>
  </body>
</html>
0
DJDaveMark