gpt4 book ai didi

javascript - 不使用 JQuery 将 Masonry 添加到 Angular

转载 作者:数据小太阳 更新时间:2023-10-29 05:23:14 24 4
gpt4 key购买 nike

我正在尝试让 Masonry 作为 Angular 指令工作,这在网上有部分记录,尽管我在以下代码中遇到以下问题:

HTML代码:

<div ng-controller="GridCtrl" class="grid-wrapper">
<div class="masonry">
<div ng-repeat="item in gridItems" ng-class="item.class">
<h3>{{item.name}}</h3>
<img ng-src="{{item.image}}"/>
<br>
<button ng-repeat="button in item.buttons">{{button.text}}</button>
</div>
</div>
</div>

Angular Directive(指令)代码:

'use strict';

angular.module('HomeCourtArenaApp').directive('masonry', function ($parse) {
return {
restrict: 'AC',
link: function (scope, elem, attrs) {
elem.masonry({ itemSelector: '.masonry-item', columnWidth: $parse(attrs.masonry)(scope) });
}
};
});

angular.module('HomeCourtArenaApp').directive('masonryItem', function () {
return {
restrict: 'AC',
link: function (scope, elem, attrs) {
elem.imagesLoaded(function () {
elem.parents('.masonry').masonry('reload');
});
}
};
});

SCSS代码:

.grid-wrapper {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: auto;
padding-left: 40%;
overflow-x: scroll;
overflow-y: hidden;
.masonry {
position: absolute;
width: 2600px;
max-height: 1080px;
.masonry-item,
.poster {
float: left;
width: 465px;
padding: 15px;
margin: 12px 12px 0 0;
box-shadow: 1px 1px 4px 3px rgba(55,55,55,0.25);
}
.masonry-item {
background: #fafafa;
height: 295px;
h3 {
width: 100%;
text-align: left;
font-size: 28px;
color: #3D444A;
display: block;
}
img {
display: block;
padding: 50px 0 10px;
margin: 0 auto;
}
}
.poster {
height: 631px;
background: #000;
position: relative;
h3 {
color: #fff;
font-family: 'adineuebold';
font-size: 68px;
position: absolute;
top: 410px;
left: 20px;
z-index: 2;
}
img {
position: absolute;
left: 0;
top: 0;
z-index: 1;
margin: 0;
padding: 0;
}
button {
position: absolute;
z-index: 2;
left: 20px;
top: 590px;
}
}
button {
padding: 12px 15px;
font-size: 15px;
margin-right: 10px;
font-family: 'adihausregular';
color: #fff;
text-transform: uppercase;
border: none;
background: linear-gradient(to bottom, rgba(57,134,202,1) 0%,rgba(3,75,146,1) 100%);
&:after {
content: "";
background: url('img/sprite.png') no-repeat -156px -9px;
width: 16px;
height: 16px;
margin-left: 30px;
display: inline-block;
}
}
}
}

此外,至关重要的是,我的脚本在索引文件中的分层方式:

<script src="scripts/app.js"></script>
<script src="scripts/directives/masonry.js"></script>
<script src="scripts/controllers/main.js"></script>

我一直在控制台中收到错误提示,我没有在某处正确定义砌体:

Uncaught TypeError: Cannot call method 'create' of undefined

然后还有:

TypeError: Object [object Object] has no method 'masonry'

谁能看出我哪里出错了?

我可能会避免使用 JQuery,因为有一个更新的 Masonry 可用但不使用它。

最佳答案

好吧,经过认真的 hack/play 之后,我有一个解决方案: AngularJS 正在动态创建 View 元素,如果“ng-repeat”加载速度慢于创建速度,则有很多错误机会砌体元素。我确信对此有更多 Angular 风格的响应,但这允许干净的标记并且需要编写更少的 Javascript 来实现所需的。只需将此代码添加为指令,添加您的子选择器,然后将“masonry”添加到您 View 中网格的父 div:

'use strict';

app.directive('masonry', function ($parse) {
return {
link: function (scope, elem, attrs) {
setTimeout(function() {
$(".masonry").masonry({
itemSelector : ".masonry-item"
});
}, 0);
}
};
});

关于javascript - 不使用 JQuery 将 Masonry 添加到 Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17169490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com