Angularjs가 객체를 지시로 전달
각진 신입사원.지시문에 물건을 넘기면서 무엇이 잘못되었는지 파악하려고 합니다.
제 지시는 다음과 같습니다.
app.directive('walkmap', function() {
return {
restrict: 'A',
transclude: true,
scope: { walks: '=walkmap' },
template: '<div id="map_canvas"></div>',
link: function(scope, element, attrs)
{
console.log(scope);
console.log(scope.walks);
}
};
});
명령어를 호출하는 템플릿은 다음과 같습니다.
<div walkmap="store.walks"></div>
store.walks
는 객체의 배열입니다.
제가 이걸 돌리면scope.walks
로 기록하다.undefined
하는 동안에scope
스코프로서 로그가 양호하고,walks
내가 찾고 있는 모든 데이터를 가진 아이.
이 방법은 이전에 나에게 효과가 있었기 때문에 내가 여기서 무엇을 잘못하고 있는지 모르겠다.
편집:
필요한 모든 코드를 포함하는 http://plnkr.co/edit/uJCxrG를 만들었습니다.
보다시피{{walks}}
스코프에서는 사용할 수 있습니다만, 아직 정의되지 않은 상태로 로깅되고 있는 링크 기능에서 액세스 할 필요가 있습니다.
사용하고 계시기 때문에$resource
데이터를 취득하기 위해서, 디렉티브의 링크 기능은, 데이터를 사용할 수 있기 전에 실행됩니다(그 이유는, 그 결과입니다).$resource
비동기)가 있기 때문에 링크 함수의 첫 번째가 됩니다.scope.walks
비어 있거나 비어 있습니다.디렉티브 템플릿에는 다음 항목이 포함되어 있습니다.{{}}
s, Angular는 a를 설정합니다.$watch
에walks
그래서, 그 때,$resource
데이터를 채웁니다.$watch
트리거 및 디스플레이가 업데이트됩니다.또한 콘솔에 walks 데이터가 표시되는 이유에 대해서도 설명합니다.링크를 클릭하여 범위를 확장할 때 데이터가 채워집니다.
문제를 해결하려면 링크 함수에서$watch
데이터를 사용할 수 있는 시기를 알 수 있습니다.
scope.$watch('walks', function(walks) {
console.log(scope.walks, walks);
})
프로덕션 코드에서 정의되지 않도록 주의하십시오.
scope.$watch('walks', function(walks) {
if(walks) { ... }
})
업데이트: Angular 버전을 사용하는 경우:$resource
@sawe의 답변도 참조하십시오.
를 사용할 수도 있습니다.
scope.walks.$promise.then(function(walks) {
if(walks) {
console.log(walks);
}
});
또 다른 해결책은 다음과 같습니다.ControllerAs
명령어 변수에 액세스할 수 있는 명령어로 이동합니다.
app.directive('walkmap', function() {
return {
restrict: 'A',
transclude: true,
controllerAs: 'dir',
scope: { walks: '=walkmap' },
template: '<div id="map_canvas"></div>',
link: function(scope, element, attrs)
{
console.log(scope);
console.log(scope.walks);
}
};
});
그런 다음 변수를 전달하여controllerAs
변수.
<div walkmap="store.walks" ng-init="dir.store.walks"></div>
시험:
<div walk-map="{{store.walks}}"></div>
angular.module('app').directive('walkMap', function($parse) {
return {
link: function(scope, el, attrs) {
console.log($parse(attrs.walkMap)(scope));
}
}
});
선언한 $controll.store가 컨트롤러에 표시되지 않습니다.함수 안에서 선언하면..따라서 이 기능은 해당 기능의 범위 내에서만 표시되므로 이를 외부에 선언해야 합니다.
app.controller('MainCtrl', function($scope, $resource, ClientData) {
$scope.store=[]; // <- declared in the "javascript" controller scope
ClientData.get({}, function(clientData) {
self.original = clientData;
$scope.clientData = new ClientData(self.original);
var storeToGet = "150-001 KT";
angular.forEach(clientData.stores, function(store){
if(store.name == storeToGet ) {
$scope.store = store; //declared here it's only visible inside the forEach
}
});
});
});
언급URL : https://stackoverflow.com/questions/14619884/angularjs-passing-object-to-directive
'it-source' 카테고리의 다른 글
Oracle에서 선택 쿼리에 대한 기본 행 순서 지정 (0) | 2023.02.25 |
---|---|
AngularJS가 Access-Control-Allow-Origin 헤더를 검출하지 않음 (0) | 2023.02.25 |
SQL Plus에서 실행되는 SQL 스크립트에서 앰퍼샌드를 무시하려면 어떻게 해야 합니까? (0) | 2023.02.25 |
Json의 PreserveReferencesHandling과 ReferenceLoopHandling의 차이점은 무엇입니까?인터넷? (0) | 2023.02.25 |
JQuery: '잡히지 않은 유형 오류:ajax 요청 시 잘못된 호출' - 여러 요소 (0) | 2023.02.25 |