2014-09-29 5 views
0

requirejs 및 각도를 사용하고 있습니다. 지금 우리는 서로 다른 모듈간에 하나의 공장을 공유하려고 노력하고 일을 할 수 없습니다.요구 사항, 각도, 모듈 간 공장 공유

컨트롤러/우리 앱에서 http 서비스에 어떻게 액세스 할 수 있습니까?

우리는 우리의 서비스 파일 requirejs 방법 (작은 추출물)를 포함 :

우리는 우리가 우리의 의존합니다 (HttpService를) 주입 자바 스크립트 파일 우리의 응용 프로그램이 그 외에도
requirejs.config({ 
    paths: { 
     httpServices: 'apps/services/Http' 
    } 
}); 

:

define(['angularAMD', "httpServices", 'ngRoute', 'underscore'], function (angularAMD, httpServices) { 
var app = angular.module("clientapp", ['ngRoute']); 

var scripts = document.getElementsByTagName("script"); 
var myScript = _.find(scripts, function (s) { 
    return s.src.substr(s.src.lastIndexOf('/') + 1, s.src.length) === 'index.js'; 
}); 
var url = myScript.src.replace("index.js", "") + "partials/"; 

app.config(function ($routeProvider) { 
     $routeProvider 
      .when('/', { 
       templateUrl: url + "dashboard.html" 
      }) 
      .when('/basicdata/index/', { 
       templateUrl: url + "basicdata/index.html" 
      }) 
    }); 

return angularAMD.bootstrap(app); 
}); 

마지막으로 서비스 자체 :

define(['angular'], function (angular) { 
'use strict'; 

/* Root herausfinden */ 
var root = window.location.pathname.split("/")[1]; 

var httpServices = angular.module('httpServices', []); 

httpServices.factory('sharedApplication', ['$rootScope', '$http', function ($rootScope, $http) { 
    var sharedApp; 
    sharedApp = {}; 
    sharedApp.currentView = "home-section"; 
    sharedApp.pastEvents = null; 
    $http.get("/" + root + "/api/search/md:ProductManager/").success(function (response) { 
     return sharedApp.pastEvents = response.data; 
    }); 
    return sharedApp; 
}]); 

return httpServices; 
}); 

우리의 문제는 우리가 단순히 ge $ get-call의 데이터에 액세스합니다.

Object {_invokeQueue: Array[1], _runBlocks: Array[0], requires: Array[0], name: "httpServices", provider: function…} 

우리는 무언가가 우리의 아약스 통화의 타이밍 또는 우리가 서비스를 사용하는 방식에 문제가 있음을 추측 : 우리는 항상이처럼 보이는 개체를 얻을.

답변

0

우리는 마침내 오늘 아침 문제를 해결할 수있었습니다. 그것은 예상보다 쉬웠다.

sharedApp.pastEvents = null; 

하려면 :

sharedApp.pastEvents = {}; 

는 이제 "pastEvents"는 "포인터"가

수행해야 할 첫 번째 일은 선을 변경하는 것입니다.

또한 각도 모듈에 종속성으로 팩터 리를 추가해야합니다. 라인 :

app.controller('TestCtrl', function (sharedApplication) 
{ 
    console.info(sharedApplication); 
}); 

"sharedApplication :이 같은 컨트롤러에 공장을 사용할 수 있습니다 수정 된 코드로

:

var app = angular.module("clientapp", ['ngRoute']); 

가 필요로 변경한다 "이제"sharedApplication.pastEvents "에서 ajax 호출로 검색된 데이터를 보유합니다.

편집 : 당신이 http.get 즉시 실행하지 않으려면

이 같은 기능에 포장 할 수 있습니다

sharedApp.testFunction = function() 
    { 
     $http.get("/" + root + "/api/search/md:ProductManager/") 
      .then(function (response){ 
      sharedApp.data = response.data; 
      }); 
    }; 

귀하의 포인터 (sharedApplication.pastEvents)는 이제 비어 함수 (sharedApplication.testFunction();)를 실행할 때까지.

안부

티모

+0

이미 개체에 대한 포인터 sharedApp 아닌가? 그래서 sharedApp.pastEvents = null을 변경; ~ sharedApp.pastEvents = {}; 아무것도 안해? – mahulst

+0

아니, 나는 그렇게 생각하지 않는다. 내가 회선을 변경하기 전까지는 응답 데이터를 가리 키지 않았습니다. Javascript의 포인터에 익숙하지 않습니다. 어쩌면 내가 틀렸어. Btw. 이제 "$ http.get 객체"자체를 반환하도록 코드를 변경했습니다. "then", "success", "error"등을 액세스 할 수 있기 때문에 이제는 ajax 호출에 쉽게 대응할 수 있습니다. –