2017-05-03 1 views
1

Ich stehe vor einem Problem für die Code-Optimierung, dh mangle. Ich benutze eckige und erfordern und alles hat gut funktioniert, außer in Service/Fabrik Fall. Es gibt einige Beispiele (helloService.coffee)AngulaJs CoffeeScript Grunt

define 'HelloService', [], -> 
    'use strict' 
    HS = ($timeout) -> 
     sayHello: (name) -> 
     $timeout -> 
      console.log 'Hello: ' + name 
     ,2000 
    HS.$inject = ['$timeout'] 
    HS 

Und in Controller ich so etwas wie dies zu machen: (mainController.coffee)

define 'MainController', ['HelloService'], (HS) -> 
    'use strict' 
    MC = ($scope) -> 
    HS.sayHello 'Stack Overflow' # it return sayHello is not a function 
    # do something with scope here 
    MC.$inject = ['$scope'] 
    MC 

Und es ist, wie app.coffee wie folgt aussehen:

define 'app', ['angular', 'HelloService', 'MainController'],(angular, HelloService, Maincontroller)-> 
    app = angular.module 'app', [] 
    app.service 'helloService', HelloService 
    app.controller 'mainController', MainController 

    app.bootstrap = -> 
    angular.element(document).ready -> 
     angular.bootstrap document, ['app'] 
    app 

Und irgendwo (main.coffee)

requirejs.config 
    baseUrl: '' 
    paths: 
    angular:['cdn_url','angular_fallback_in_project_dir'] 
    shim: 
    angular: 
     exports: 'angular' 
     deps: [] 

require ['app'], (app) -> 
    app.bootstrap() 

Dieser Keep-Code ist einfacher zu pflegen und es ist wirklich mimifikationsfreundlich. Wenn ich versuche, so etwas wie:

hs = new HS() 

Dann kann ich hs.saylHello ‚String‘ nennen, aber jetzt $ timeout undefiniert oder irgendwann ist nicht funktionieren. Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Nach einem langen Codeprüfung, die statt

define 'MainController', [], -> 
    'use strict' 
    MC = ($scope, HelloService) -> 
     HS.sayHello 'Stack Overflow' # it return sayHello is not a function 
     # do something with scope here 
    MC.$inject = ['$scope', 'HelloService'] 
    MC 

ist der Service „Helloservice“ zu laden, benötigen zu verwenden wir geben diesen Job zu eckig. Der Grund für diese Wahl ist, dass $ inject das Argument (in der Liste) als Instanz mit einem neuen Schlüsselwort aufgerufen hat, so dass alle Eigenschaften verfügbar sind. Aber wenn Sie nicht eckig verwenden wir müssen sie schreiben wie diese

define 'MainController', ['HelloService'], (HS) -> 
    'use strict' 
    MC = ($scope) -> 
    HSS = new HS() 
    HSS.sayHello 'Stack Overflow' # it return sayHello is not a function 
    # do something with scope here 
    MC.$inject = ['$scope'] 
    MC 

Und deshalb ist das Verhalten gleich. Das ist alles.