2013-11-19 4 views
0

Я использую jQueryUI в сочетании с RequireJS и AngularJS. Я завернул компоненты jqueryui в требуют утверждения как:jQueryUI + RequireJS + AngularJS исключает исключения

define(['jquery','./core','./mouse', './widget'], function (jQuery) { 
    (function($, undefined) { 

     $.widget("ui.draggable", $.ui.mouse, {....}); 
    })(jQuery); 

}); 

и создал AngularJS директиву, чтобы обернуть это нравится:

require(['angular', 'app', 'jquery', 'lib/jquery-ui/draggable'], function(angular, app, $){ 

    app.directive('draggable', ['$timeout','draggableConfig', function ($timeout) { 
     return { 
     restrict: 'AE', 
     scope: { 
      ngModel: '=', 
      options: '=' 
     }, 
     link: function ($scope, $element, $attributes) { 
      $timeout(function(){ 
       $element.draggable(); 
      }, 50) 
     } 
    } 
    }]); 
}); 

, но 2 из каждых 5 раз приложение выдает ошибку, как:

TypeError: Object [object Object] has no method 'draggable' 
at http://localhost/phoenix/directives/draggable.js:21:30 
at http://localhost/phoenix/lib/angular/angular.js:13152:28 
at completeOutstandingRequest (http://localhost/phoenix/lib/angular/angular.js:3996:10) 
at http://localhost/phoenix/lib/angular/angular.js:4302:7 

Я пробовал бесчисленные вещи, но не повезло последовательно. Я уверен, что draggable не получает привязки к времени загрузки по директиве $, но зависимости правильны, поэтому я потерян, почему. Есть предположения?

+0

Как вы думаете, у вас есть что-то связанное с 50 миллисекундами тайной тайм-аута? это попытка избежать исключения? + –

+0

Я, я добавил $ timeout, чтобы попытаться избежать исключения. – amcdnl

ответ

0

директива была require, когда она должна использоваться define.

+1

вы можете объяснить? не понимаю – harrrrrrry

0

Его вопрос времени. RequireJs загружает файлы асинхронно. Вам нужно сделать jquery-ui зависимость jquery в конфигурации require.

require.config({ 
    baseUrl: 'Scripts/App', 
    paths: { 
     jQueryUI: '../Lib/Jquery/jquery-ui.min', 
     jQuery: '../Lib/Jquery/jquery.min'   
    }, 
    shim: { 
     jQueryUI: { deps: ['jQuery'] }, 
    } 
}); 

Plunker

+0

Хорошо, это имеет смысл, но я думал, что упаковка требуемых компонентов и наличие jquery будут частью этого, и это исправит, а? – amcdnl

+0

Я не уверен насчет обертывания, но я добавил пример моего ответа. – Rob

Смежные вопросы