【问题标题】:How to setup Skrollr.js with AngularJS and RequireJS如何使用 AngularJS 和 RequireJS 设置 Skrollr.js
【发布时间】:2015-01-25 02:20:16
【问题描述】:

我在使用 AngularJS 和 RequirejS 设置 Skrollr 时遇到了困难。

一些文章建议将 Skrollr 设置为指令,这是我一直遵循的方法。不幸的是,Skrollr 无法初始化。具体来说,当我尝试从指令中调用 skrollr.init() 时,我收到一条错误消息,指出未定义 skrollr。

下面是我的代码:

directives.js

define(['directivesFactory', 'skrollr'], function(directivesFactory){

directivesFactory.directive('skrollr', [function(){  
    var directiveDefinitionObject = {
        link: function() {
            skrollr.init();
        }
    };

    return directiveDefinitionObject;
}]);
});

main.js

(function() {

'use strict';

require.config({
    baseUrl: 'js',
    paths: {
        'angular': 'libs/angular-1.3.9',
        'angularRoute': 'libs/angular-route-1.3.9',
        'bootstrap': 'libs/modernizr-2.6.2-respond-1.1.0.min',
        'jquery': 'libs/jquery-1.11.0.min',
        'bootstrapJS': 'libs/bootstrap',
        'jqueryElastislide': 'libs/jquery.elastislide',
        'jqueryPpCustom' : 'libs/jquerypp.custom',
        'modernizrCustom' : 'libs/modernizr.custom.17475',
        'skrollr' : 'libs/skrollr.min'
    },
    shim: {
        'angular': {
            exports: 'angular'
        },
        'angularRoute': {
            deps: ['angular']
        },
        'jquery': {
            exports: '$'
        },
        'bootstrapJS': {
            deps: ['jquery']
        },
        'jqueryElastislide':{
            deps: ['jquery']
        },
        'jqueryPpCustom':{
            deps: ['jquery']
        },
        'skrollr': {
            exports: 'skrollr'
        }
    }
});

define('controllersFactory', ['angular'], function(angular) {
    return angular.module('app.controllers', []);
});

define('servicesFactory', ['angular'], function(angular) {
    return angular.module('app.services', []);
});

define('directivesFactory', ['angular'], function(angular) {
    return angular.module('app.directives', []);
}); 

define('app', [
    'angular',
    'angularRoute',
    'servicesFactory',
    'controllersFactory',
    'directivesFactory',
    ],
    function(angular) {
        return angular.module('app', ['app.services', 'app.controllers', 'app.directives', 'ngRoute']);
    }
);

require(['app', 
    'jquery',
    'skrollr',
    'bootstrap', 
    'bootstrapJS',
    'jqueryElastislide',
    'jqueryPpCustom',
    'modernizrCustom'], 
    function(app, 
        jquery, 
        skrollr,
        bootstrap, 
        bootstrapJS, 
        jqueryElastislide, 
        jqueryPpCustom, 
        modernizrCustom) {
    require([
            'controllers/mainController'
        ],
        function() {
            app.config(['$routeProvider', function($routeProvider) {
                $routeProvider.
                    when('/', {templateUrl: 'templates/main.html', controller: "MainController"}).
                    otherwise({redirectTo: '/'});
            }]);

            angular.bootstrap(document, ['app']);
        }
    );
});
})();

从 web 检查器中,我看到 skrollr.min.js 在directives.js 文件之前加载,所以我相信指令应该能够调用skrollr 中的函数。

任何建议将不胜感激 - 谢谢!

【问题讨论】:

    标签: javascript angularjs requirejs skrollr angular-directive


    【解决方案1】:
    define(['directivesFactory', 'skrollr'], function(directivesFactory){
    
    directivesFactory.directive('skrollr', [function(){  
        var directiveDefinitionObject = {
            link: function() {
                skrollr.init();
            }
        };
    
        return directiveDefinitionObject;
    }]);
    });
    

    这里好像没有需要skrollr,需要添加require。

    【讨论】:

    • 感谢您的建议。我从未尝试在指令中添加要求……您介意详细说明您的意思吗?我认为添加需要模块将在 main.js 文件中完成
    • 在这个特定的文件中,您实际上并没有从 requirejs 获取 skrollr 的代码。你需要要求它。即使您在主文件中指定了路径,它也不会在此文件中可用,除非您通过调用 require('skrollr', function(skrollr) { ... use skrollr ...} )
    • 感谢您的帮助。我又修改了一些,结果发现答案非常简单。在我使用define() 的第一行中,我将'skrollr' 作为依赖项包含在内,但我忘记将skrollr 作为参数与directivesFactory 一起传递。我所要做的就是将第一行更改为:define(['directivesFactory', 'skrollr'], function(directivesFactory, skrollr){
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2016-06-09
    • 2014-08-03
    相关资源
    最近更新 更多