Angular에서 $scope 액세스JS 공장?
Angular는 처음입니다.JS와 매우 흥미롭다고 생각합니다만, 아래의 상황은 조금 불명확합니다.
app.factory('deleteFac', function($http){
var factory = {};
factory.edit = function(id){
$http.get('?controller=store&action=getDetail&id=' + id).
success(function(data, status){
/**
got an error on the following
when i use return data; and i get data undefined
in the controller which i get it because its doing a ajax call
you don't get data until the call first.
**/
$scope.detail = data;
})
}
return factory;
})
에 할당하면 에러가 발생합니다.$scope
반환 데이터를 사용할 수 있습니다. 반환 데이터를 할당하는 방법은 없습니까?$scope
?
보통 사용하는 것은 아닙니다.$scope
공장, 서비스 또는 프로바이더 내부.보통, 당신은 그 물건을 돌려주곤 했다.promise
(추정자)$http
그 후 컨트롤러에서 약속을 처리합니다(이 컨트롤러에서는$scope
).
factory.edit = function(id){
return $http.get('?controller=store&action=getDetail&id=' + id);
}
컨트롤러 기능:
$scope.edit = function(id) {
deleteFac.edit(id).then(function(response) {
$scope.something = response.model;
});
}
이런 뜻이었나 보네
app.factory('deleteFac', function($http){
var service = {};
factory.edit = function(id, success, error){
var promise = $http.get('?controller=store&action=getDetail&id=' + id);
if(success)
promise.success(success);
if(error)
promise.error(error);
};
return service;
});
다음으로 컨트롤러에서 다음을 수행합니다.
function MyController($scope, deleteFac){
deleteFac.edit($scope.id, function(data){
//here you have access to your scope.
});
}
다음 트릭은 매우 나쁜 방법이지만 급할 경우 사용할 수 있습니다.
의 교환$scope
포함:angular.element('[ng-controller=CtrlName]').scope()
개인적으로는 공장에서 스코프를 사용하고 싶기 때문에, 모두 이동하는 것이 아니라, 공장에 콜하는 클라이언트의 파라미터로서 스코프를 전달합니다.기능하다
또한 $scope를 사용하려고 할 때도 같은 문제가 있었습니다.watch(...)는 공장이나 서비스에서 직접 $scope를 사용할 수 없기 때문에 이렇게 동작하고 싶었기 때문에 parameter로 scope를 설정하고 공장 클라이언트에 $scope를 보내도록 기능을 업데이트한 것입니다.이것이 저의 해결책입니다.
var app = angular.module("myApp", []);
app.factory('MyFactory', function($http) {
var factory = {};
//This is only for my own issue I faced.
factory.Images = {};
factory.myFunction = function(id, scope) {
//This is an example of how we would use scope inside a factory definition
scope.details = "Initial Value";
//In my case I was having this issue while using watch
scope.$watch('details' , function(newValue, oldValue) {
if(oldValue){
scope.log = "Details was updated to : " +newValue;
}
});
scope.details = "My Id is: "+id;
};
return factory;
});
//Controller: Factory's Client.
app.controller("MyController", ['$scope', 'MyFactory', function($scope, MyFactory) {
MyFactory.myFunction(5, $scope);
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MyController">
<span>{{details}} </span>
<hr>
<p>{{log}} </p>
</div>
이게 도움이 됐으면 좋겠어요.안부 전해요.
이것이 가장 깨끗한 해결책이라고 생각합니다.
문제나 개선 사항이 있으면 알려주세요.
(function(){
angular.controller('controllerName', controllerName);
controllerName.$inject = ['$scope', factory];
function controllerName($scope, factory){
var vm = this;
vm.data = factory.alertPopup();
}
angular.factory('factory', factory);
factory.$inject = ['externalServices'];
function factory(externalServices){
return {
returnData : returnData
}
function returnData(){
return externalServices.whatever();
}
}
})();
.factory('POPUP', function($ionicLoading, $ionicPopup) {
var self = this;
// THIS BLOCK SCREEN ! for loading ! Be carefoull !! ( deprecated: assign this to a var for security)
self.showLoading = function(title, message, scope){
scope.loading = true;
return $ionicLoading.show({ content: message, showBackdrop: false });
};
self.hideLoading = function(title, message, scope){
scope.loading = false;
return $ionicLoading.hide();
};
// NOT BLOCK SCREEN- SIMPLE ALERTS - Standards popups
self.showAlert = function(title, message, callback){
var alertPopup = $ionicPopup.alert({ title: title, template: message });
alertPopup.then(function(res) {
console.log('callback popup');
if (callback){ callback(); }
});
};
self.showConfirm = function(objectPopup, callback){
if (objectPopup === undefined){ objectPopup = { title: 'test confirm Popup', template: 'Message test Confirm POPUP' }; }
var alertPopup = $ionicPopup.confirm(objectPopup);
alertPopup.then(function(res) {
if (res) { callback(true); }
else { callback(false); }
});
};
return self;
})
이 질문이 오래됐다는 건 알지만, 이게 나한테 효과가 있었던 거야
app.factory('myFactory',function(){
let toRet = {
foo: foo
}
return toRet;
function foo(){ // This function needs to use passed scope.
let $scope = toRet.$scope;
// Do stuff with $scope.
}
});
app.controller('myController',function($scope,myFactory){
myFactory.$scope = $scope;
/*
We could just pass $scope as a parameter to foo, but this is
for cases where for whatever reason, you cannot do this.
*/
myFactory.foo();
});
언급URL : https://stackoverflow.com/questions/22159189/accessing-scope-in-angularjs-factory
'programing' 카테고리의 다른 글
AJAX & jQuery에서 django 폼을 게시하는 방법 (0) | 2023.03.23 |
---|---|
새 봄 MVC 프로젝트를 위한 Tymeleaf와 Angular 중 선택 (0) | 2023.03.23 |
반응: 모달 열 때 스크롤 방지 (0) | 2023.03.23 |
실패한 폼 propType: "onChange" 핸들러가 없는 폼 필드에 "값" 프로포트를 제공했습니다. (0) | 2023.03.23 |
주석을 사용하지 않는 잭슨의 필드를 제외하려면 어떻게 해야 합니까? (0) | 2023.03.23 |