我设法将 jQuery MixItUp 集成到我的 AngularJs 应用程序中。
应该使用 MixItUp 显示的项目是从自定义服务加载的。获取所有项目后,我会触发 jQuery MixItUp 的实例化。
我也在使用 AngularJS NgRoute 来实现不同的页面。
当我第一次访问使用 jQuery MixItUp 的页面时,一切都很好。但是当我然后转到另一个页面并使用 jQuery MixItUp 返回页面时,过滤器和排序不再起作用。
我像这样设置我的路线:
myApp
.config(function($routeProvider, $locationProvider) {
$routeProvider
// some routes for other pages
.when('/', {
templateUrl : '/assets/js/app/views/home.html',
controller : 'MainController'
})
.when('/about', {
templateUrl : '/assets/js/app/views/about.html',
controller : 'AboutController'
})
// route for page where MixItUp is used
.when('/media', {
templateUrl : '/assets/js/app/views/media.html',
controller : 'MediaController'
})
// 404
.otherwise({
redirectTo : '/404'
})
$locationProvider.html5Mode(true);
});
在我的自定义指令中,我使用一些选项初始化 jQuery MixItUp,并在初始化后修复排序。console.log
每次我访问或重新访问页面时都会登录到控制台。但是重新访问过滤器和排序的功能被破坏了。自定义指令如下所示:
myApp
.directive('mixitup', function($compile) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
scope.$on('init-mixitup', function(event) {
console.log('[event] înit-mixitup');
angular.element(element).mixItUp({
animation: {
duration: 200
},
load: {
sort: 'myorder:desc'
},
debug: {
enable: true,
mode: 'normal'
}
});
});
scope.$on('resort-mixitup', function(event, sortCommand) {
console.log('[event] resort-mixitup');
angular.element(element).mixItUp('sort', sortCommand);
});
}
};
});
在我的 AngularJS 控制器(MediaController)中,一旦从自定义服务中获取所有项目,我就会广播事件:
// init
$rootScope.$broadcast('init-mixitup');
// sort
$rootScope.$broadcast('resort-mixitup', 'myorder:desc');
视图 HTML 如下所示:
<div class="btn-group controls">
<button class="btn btn-lg filter"
data-filter="all">All</button>
<button class="btn btn-lg filter"
data-filter=".photo">Photo</button>
<button class="btn btn-lg filter"
data-filter=".audio">Audio</button>
<button class="btn btn-lg filter"
data-filter=".video">Video</button>
</div>
<div mixItUp="mixItUp" id="mixitup-container">
<div ng-repeat="item in items"
id="{{ item.id }}"
style="display: inline-block;"
data-myorder="{{ item.date }}"
class="mix col-xs-6 col-sm-4 {{ item.category }}">
<img ng-src="{{ item.image }}" class="img-responsive img-circle">
</div>
</div>
chrome 中的 Javascript 控制台在第一页加载时输出以下内容:
[event] înit-mixitup
[MixItUp][mixitup-container][_bindHandlers] 4 filter buttons found.
[MixItUp][mixitup-container][_init] MixItUp instantiated on container with ID "mixitup-container".
[MixItUp][mixitup-container][_init] There are currently 1 instances of MixItUp in the document.
[event] resort-mixitup
[MixItUp][mixitup-container][multiMix] Operation requested via the API.
[MixItUp][mixitup-container][multiMix] An operation was requested but MixItUp was busy. The operation was added to the queue in position 1.
[MixItUp][mixitup-container][multiMix] Loading operation from queue. There are 0 operations left in the queue.
[MixItUp][mixitup-container][multiMix] Operation requested via the API.
[MixItUp][mixitup-container][multiMix] Operation started.
[MixItUp][mixitup-container][_cleanUp] Loading animation completed successfully.
[MixItUp][mixitup-container][_cleanUp] The operation completed successfully.
在第二页加载时(移动到其他页面后,无需重新加载浏览器):
[event] înit-mixitup
[event] resort-mixitup
[MixItUp][mixitup-container][multiMix] Operation requested via the API.
[MixItUp][mixitup-container][multiMix] Operation started.
这里还有一个与此问题相关的问题:如何使用 AngularJS NgRoute 启动 MixItUp 但是这些项目不是通过自定义服务动态加载的。