Ich mache eine Web-App mit AngularJS, jQuery, HTML, CSS und Bootstrap, und ich möchte einige Bild Links von meinem JSON, die in einem befindet Apache2 Server und verwende sie, um diese Bilder auf meiner Hauptseite zu rendern. Ich möchte sie auch gerne wie in einem Karussell wischen. Um das zu erreichen, versuche ich iDangero.us Swiper zu verwenden.jQuery Swiper-Skript zum Ausführen nach Ng-Repeat-Elemente geladen werden
Wenn ich meine Bilder mit 3 getrennten divs wähle, habe ich keine Probleme. Ich bekomme meine Bilder und dann kann ich sie normalerweise wischen, wie ich will. Ich mache es unten wie:
Main.html:
<div ng-init="initGetRequestMain()">
<div class="swiper-slide" ng-click="swipers()"
style="{{data.background1}}"></div>
<div class="swiper-slide" ng-click="swipers()"
style="{{data.background2}}"></div>
<div class="swiper-slide" ng-click="swipers()"
style="{{data.background3}}"></div>
<script src="scripts/custom/main/swipers.js"></script>
</div>
I swiper verwenden, um von einem Bild zum anderen zu streichen, und es scheint zu funktionieren, wie es sollte. Es ist ein jQuery-Plugin, und Sie können einige Demos unter this link sehen.
Swipers.js:
angular.module('swipers', [])
.controller('',[
$(document).ready(function(){
var swiper = new Swiper('.swiper-container',{
direction: 'horizontal',
pagination: '.swiper-pagination',
paginationClickable: true
})
})]);
Json:
"background1":"background-image: url(images/img1.jpg)",
"background2":"background-image: url(images/img2.jpg)",
"background3":"background-image: url(images/img3.jpg)"
mainController.js:
myApp.controller('MainController', ["$scope","$http",
function($scope,$http){
$scope.initGetRequestMain = function(){
$http.get('http://localhost/main.json').success(function(data){
$scope.data=data;
})
}
}]);
Das Problem ist, wenn ich versuche, ng-repeat
anstelle von 3 getrennten Divs zu verwenden, kann ich sie nicht mehr sehen und mein Swiper-Skript löst aus, bevor sie voll geladen sind. Ich habe keine Fehler in meiner Konsole oder in meinem JSON (validiert mit JSONLint). Im Folgenden habe ich zwei Screenshots meiner Ausgabe in beiden Situationen hinzugefügt.
Arbeiten mit 3 getrennt divs:
Nicht mit ng-repeat arbeiten:
Dies ist der Code, wo ich versuche ng-repeat
Arbeit zu machen den gleichen Controller und das gleiche Swiper-Skript wie zuvor:
Main.html:
<div ng-init="initGetRequestMain()">
<div ng-repeat="slide in data.slides" isLoaded="">
<div class="swiper-slide" style="{{slide.background}}"
ng-click="swipers()"></div>
</div>
<script type="text/javascript-lazy" src="scripts/custom/main/swipers.js"></script>
</div>
mainJson.json:
"slides":[
{"background":"background-image:url('images/img1.jpg')"},
{"background":"background-image:url('images/img2.jpg')"},
{"background":"background-image: url('images/img3.jpg')"}
],
Um meine Bilder vor dem Auslösen das Skript geladen werden, ich versuche 2 Gewohnheit zu verwenden Richtlinien.
isLoaded
sagt mir, wenn das letzte ng-repeat
Element geladen ist und setzt pageIsLoaded = true;
:
myApp.directive('isLoaded', function(){
return{
scope:true,
restrict: 'A', //Attribute type
link: function (scope, elements, arguments){
if (scope.$last === true) {
scope.pageIsReady = true;
console.log('page Is Ready!');
}
}
}
})
gettingTheScript
wartet auf pageIsLoaded = true;
und lädt das Skript:
myApp.directive('src', function(){
return{
scope:true,
restrict: 'A', //Attribute type
link: function (scope, elements, arguments){
scope.$on(pageIsReady===true, function(){
if (attr.type === 'text/javascript-lazy'){
scope.scriptLink = arguments.src;
}
})
},
replace: true, //replaces our element
template: '{{scriptLink}}'
}
})
Sie scheinen nicht mein Problem zu beheben. Ich kann console.log('page Is Ready!');
auch nicht sehen, wenn ich das erste mache.
Ich habe nur einige Probleme, wenn ich ein Skript wie Swiper auslösen muss, nachdem die Seite geladen wurde, um diese Art von Problemen zu vermeiden. Meine Bilder scheinen keine Höhe zu haben. Ich denke, dass das Problem von ng-repeat
nicht vollständig geladen wird, bevor Sie mein Skript auslösen.
Was mache ich falsch? Gibt es bessere Lösungen?
Sie haben Richtlinie verwenden für diese –
@KevalBhatt Können Sie das konkretisieren? Vielen Dank. – AndreaM16
Wie Sie traurig, dass Ihr Skript ausgelöst wird, bevor sie geladen werden, so müssen Sie eine Direktive dafür schreiben und in der Anweisung $ timeout verwenden. Wenn Sie auf eckigen Seite arbeiten, dann für DOM-Manipulation immer Direktive verwenden, weil JavaScript zuerst dann Ihren anderen Code ausführen, so wie eckig weiß, dass Ihr JavaScript-Code einige Manipulation an Ihren Bildern tun wird –