【发布时间】:2016-07-16 14:58:23
【问题描述】:
使用isotope 和prettyPhoto 以角度js 创建我的画廊视图,但得到错误无法在初始化之前调用同位素上的方法;试图调用方法“reLayout”我正在控制器中加载我的画廊视图,如下所示:
index.html
<ng-view></ng-view>
app.js
angular.module("myapp", ["ngRoute", "ui.bootstrap", "slickCarousel"]).
config(function($routeProvider, $locationProvider) {
$routeProvider.
when("/home", {
templateUrl: "partial views/home.html"
})
}).controller("portfolioController", function($scope, $location) {
//Portfolio
$scope.$watch("$viewContentLoaded", function() {
"use strict";
var $container = $('.portfolio'),
$items = $container.find('.portfolio-item'),
portfolioLayout = 'fitRows';
if ($container.hasClass('portfolio-centered')) {
portfolioLayout = 'masonry';
}
var init = false;
$container.isotope({
filter: '*',
animationEngine: 'best-available',
layoutMode: portfolioLayout,
animationOptions: {
duration: 750,
easing: 'linear',
queue: false
},
masonry: {}
}, refreshWaypoints());
function refreshWaypoints() {
init = true;
setTimeout(function() {}, 1000);
}
$('nav.portfolio-filter ul a').on('click', function() {
var selector = $(this).attr('data-filter');
$container.isotope({
filter: selector
}, refreshWaypoints());
$('nav.portfolio-filter ul a').removeClass('active');
$(this).addClass('active');
return false;
});
function getColumnNumber() {
var winWidth = $(window).width(),
columnNumber = 1;
if (winWidth > 1200) {
columnNumber = 5;
} else if (winWidth > 950) {
columnNumber = 4;
} else if (winWidth > 600) {
columnNumber = 3;
} else if (winWidth > 400) {
columnNumber = 2;
} else if (winWidth > 250) {
columnNumber = 1;
}
return columnNumber;
}
function setColumns() {
var winWidth = $(window).width(),
columnNumber = getColumnNumber(),
itemWidth = Math.floor(winWidth / columnNumber);
$container.find('.portfolio-item').each(function() {
$(this).css({
width: itemWidth + 'px'
});
});
}
function setPortfolio() {
setColumns();
if (init) $container.isotope('reLayout');
}
$container.imagesLoaded(function() {
setPortfolio();
});
$(window).on('resize', function() {
setPortfolio();
});
});
})
home.html
<div id="portfoliowrap" ng-controller="portfolioController">
<h3>LATEST WORKS</h3>
<div class="portfolio-centered">
<div class="recentitems portfolio">
<div class="portfolio-item graphic-design">
<div class="he-wrap tpl6">
<img src="/img/portfolio/portfolio_09.jpg" alt="">
<div class="he-view">
<div class="bg a0" data-animate="fadeIn">
<h3 class="a1" data-animate="fadeInDown">A Graphic Design Item</h3>
<a data-rel="prettyPhoto" href="assets/img/portfolio/portfolio_09.jpg" class="dmbutton a2" data-animate="fadeInUp"><i class="fa fa-search"></i></a>
<a href="single-project.html" class="dmbutton a2" data-animate="fadeInUp"><i class="fa fa-link"></i></a>
</div><!-- he bg -->
</div><!-- he view -->
</div><!-- he wrap -->
</div><!-- end col-12 -->
<div class="portfolio-item books">
<div class="he-wrap tpl6">
<img src="/img/portfolio/portfolio_10.jpg" alt="">
<div class="he-view">
<div class="bg a0" data-animate="fadeIn">
<h3 class="a1" data-animate="fadeInDown">A Book Design Item</h3>
<a data-rel="prettyPhoto" href="assets/img/portfolio/portfolio_10.jpg" class="dmbutton a2" data-animate="fadeInUp"><i class="fa fa-search"></i></a>
<a href="single-project.html" class="dmbutton a2" data-animate="fadeInUp"><i class="fa fa-link"></i></a>
</div><!-- he bg -->
</div><!-- he view -->
</div><!-- he wrap -->
</div><!-- end col-12 -->
</div><!-- portfolio -->
</div><!-- portfolio container -->
</div><!--/Portfoliowrap -->
如您所见,我还使用了$scope.$watch("$viewContentLoaded", 来确保已加载视图。但仍然超过错误。 Isotope 工作正常,但 prettyphoto 不能正常工作,这可能是因为这个错误。希望得到一些指导。
【问题讨论】:
-
总是在指令中初始化插件。
$viewContentLoaded不会向您保证所有渲染都已完成。控制器中不应该有任何与 dom 相关的代码。我相信已经有一个包裹同位素的角度模块...mankindsoftware.github.io/angular-isotope -
@charlietfl.. 我会检查一次并通知.. :)
-
也不要认为你可以用
$watch代替$viewContentLoaded,这是一个事件,你会使用$on。不顾一切的方法都是错误的......需要指令 -
@charlietfl.. 非常感谢.. 我已经解决了.. :)
标签: jquery angularjs jquery-isotope prettyphoto