【问题标题】:Angular directive with transcluded elements + RequireJS not working带有嵌入元素的 Angular 指令 + RequireJS 不起作用
【发布时间】:2017-01-10 12:59:20
【问题描述】:

In this punk 我正在尝试使用带有transclude: true 和RequireJS 的Angular 指令。嵌入的元素应包含在用户单击按钮时打开的 Angular UI 模态中。

代码使用ui.router显示视图,其中一个有一个打开模态的按钮。

This is a working example没有使用RequireJS,你可以在Angular UI modal中看到被嵌入的元素。

使用 RequireJS 时,我在控制台中收到以下错误:

未知提供者:$templateRequestProvider

缺少什么?

HTML

<ul class="menu">
  <li><a href ui-sref="view1">Some content</a></li>
  <li><a href ui-sref="view2">Some modal</a></li>
</ul>

<div ui-view></div>

<script data-main="config" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.9/require.min.js"></script>

config.js

require.config({
    paths: {
        'angular': 'https://code.angularjs.org/1.2.16/angular',
        'uiBootstrap' : 'https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.4.0/ui-bootstrap-tpls',
        'domReady': 'https://cdnjs.cloudflare.com/ajax/libs/require-domReady/2.0.1/domReady',
        "uiRouter": "https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router"
    },
    shim: {
        'angular': {
            exports: 'angular'
        },
        'uiBootstrap': { 
          exports: 'uiBootstrap', 
          deps: ['angular'] 
        },
        'uiRouter':{
            deps: ['angular']
        }
    },

    deps: [
        'start'
    ]

});

start.js

define([
    'require',
    'angular',
    'app',
    'routes'
], function (require, angular) {
    'use strict';
    require(['domReady!'], function (document) {
        angular.bootstrap(document, ['app']);
    });
});

routes.js

define(['app','ctl'], function(app) {

    'use strict';
    return app.config(function($stateProvider, $urlRouterProvider) {

        $urlRouterProvider.otherwise("/view1");

        $stateProvider.state('view1', {
              url: "/view1",
              templateUrl: "partial1.html"
            })
        .state('view2',{
            url: '/view2',
            templateUrl: 'partial2.html'
        });
    })
});

ctl.js

define(['app','modal'], function (app) {

  'use strict';
  app.controller('ctl', function($scope) {
    $scope.open = function () {
        $scope.modalCtl.openModal();
    };
  });   
});

modal.js

define(['app','uiBootstrap'], function (app) {

   'use strict';
   app.directive("modal", function($timeout,$uibModal) {
          return {
            restrict: "AE",        
            scope: {              
                control: '='
            },
            transclude: true,
            link: function (scope, element, attrs, ctrl, transclude) {

              scope.control = scope.control || {}

                scope.control.openModal = function () {

                    var instance = $uibModal.open({
                      windowClass: 'the-modal',
                      template: '<div class="content"></div>',
                      appendTo: element
                    });

                    $timeout(function (){
                        transclude(scope.$parent, function(clonedContent){
                          element.find('.content').append(clonedContent);  
                        })
                    },10);

                };

            }
          }
    });
});

【问题讨论】:

    标签: angularjs angularjs-directive angular-ui-router requirejs angular-ui


    【解决方案1】:

    您在损坏的 plunker 中使用的 ui-bootstrap 版本 (2.4.0) 需要 angular 1.3+ $templateRequest 服务。因此,它与 Angular 1.2 不兼容。

    更新你的 plunker 中的 Angular 版本,它应该开始工作了。 http://plnkr.co/edit/OXBbmWS9yiAfnxsiNHsP?p=preview

    【讨论】:

    • 当modal打开时,没有显示嵌入的内容,知道为什么吗?
    • 我不认为你的 modal.js 可以按照它的编码方式工作。您是否找到了一个带有嵌入功能的 ui-bootstrap 模式示例?
    • 它在这个例子中工作(没有RequireJS)plnkr.co/edit/pChKm1FKDcyfn2iWd4K5?p=preview
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多