首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery MixItUp和AngularJS NgRoute

jQuery MixItUp和AngularJS NgRoute
EN

Stack Overflow用户
提问于 2015-11-11 13:11:30
回答 2查看 373关注 0票数 0

我成功地将jQuery MixItUp集成到我的AngularJs应用程序中。

应该用MixItUp显示的项是从自定义服务加载的。获取所有项后,我将触发jQuery MixItUp的实例化。

我还使用AngularJS NgRoute实现不同的页面。

当我第一次访问使用jQuery MixItUp的页面时,一切都很好。但是,当我使用jQuery MixItUp转到另一个页面并返回到页面时,过滤器和排序就不再起作用了。

我的路线是这样设置的:

代码语言:javascript
复制
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中添加了一些选项,并修复了init之后的排序。每当我访问或重新访问该页面时,console.log都会记录以控制台。但是,在重新检查过滤器的功能和排序是坏的。自定义指令如下所示:

代码语言:javascript
复制
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)中,一旦从自定义服务中获取所有项,我就会广播事件:

代码语言:javascript
复制
// init
$rootScope.$broadcast('init-mixitup');

// sort
$rootScope.$broadcast('resort-mixitup', 'myorder:desc');

HTML视图如下所示:

代码语言:javascript
复制
<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控制台在第一页加载时输出以下内容:

代码语言: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.

在第二页加载(移动到其他页面后,无需重新加载浏览器):

代码语言:javascript
复制
[event] înit-mixitup
[event] resort-mixitup
[MixItUp][mixitup-container][multiMix] Operation requested via the API.
[MixItUp][mixitup-container][multiMix] Operation started.

这里还有另一个有关这个问题的问题:How to initiate MixItUp with AngularJS NgRoute,但是这些项不是通过自定义服务动态加载的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-11 13:28:37

我在离开页面时调用jQuery MixItUp destroy函数解决了这个问题。

我在MixItUp的指令中添加了另一个事件侦听器:

代码语言:javascript
复制
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'
                    }
                });
            });

            scope.$on('resort-mixitup', function(event, sortCommand) {
                // console.log('[event] resort-mixitup');
                angular.element(element).mixItUp('sort', sortCommand);
            });

            scope.$on('destroy-mixitup', function(event) {
                // console.log('[event] destroy-mixitup');
                angular.element(element).mixItUp('destroy');
            })
        }
    };
});

还在我的AngularJS控制器(MediaController)中添加了事件触发器:

代码语言:javascript
复制
$scope.$on("$destroy", function(){
    $rootScope.$broadcast('destroy-mixitup');
});
票数 0
EN

Stack Overflow用户

发布于 2016-04-04 20:54:01

那它呢!

代码语言:javascript
复制
    'use strict';
  angular.module('rjApp')
    .directive('mixitup',function($timeout,$compile){
      var linker = function(scope,element,attr) {

        scope.$watch('entities', function(newVal, oldVal){

            if (element.mixItUp('isLoaded')) {
              element.mixItUp('destroy');
              element.mixItUp();
            } else {
              element.mixItUp();
            }
        },true);

      };
      return {
        link: linker,
        scope:{entities:'='}
      }
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33651256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档