2013-12-11 2 views
2

편집기 (양식)를 포함하는 지시문을 생성하려고합니다. 바깥 쪽 컨트롤러는 내부 지시어로 "편집 할 물건"을 쉽게 밀어 넣을 수 있습니다. 그러나 바깥 쪽 컨트롤러가 폼이 더러운지를 알기를 바랍니다. 내 전체 템플릿 (간체) :지시어 템플릿 안에있는 양식의 상태에 액세스하는 "각"방식이란 무엇입니까?

directive('accountEditor',[ 'account', function(account) { 
    return { 
    restrict: 'E', 
    scope: { 
     accountId: '=', 
     dirtyFlag: '=' 
    }, 
    link: function($scope, element, attr, ctrl) { 
     $scope.$watch('accountId', function() { 
     $scope.accountToEdit = account.getAccount($scope.accountId); 
     }); 
     // I WANT TO WATCH THE FORM STATE, AND UPDATE dirtyFlag 
    }, 
    template: '<form><input ng-model="accountToEdit.name"/></form>' 
    }; 
}]); 

내가 <에 넣어 추가 지침을 작성해야 :

<div ng-controller="outer"> 
    <account-editor account-id="currentID" dirty-flag="isDirty"></account-editor> 
</div> 

내가이 지시문은 "외부"컨트롤러의 IsDirty 사용 플래그를 업데이트해야 할 양식 >을 사용하거나 이벤트를 사용하거나 링크 중 DOM에 직접 액세스하거나 다른 것을 사용 하시겠습니까?

내 전체 코드는 http://jsbin.com/amuduro/1/edit이지만 더 많은 기능이 포함되어 있습니다. 에 양식 이름을 넣는

+0

조금만 놀아주세요. 여기 하나의 중요한 개념이 있습니다. 범위에서 ** 프리미티브 **를 사용하여 하위 범위를 전달하지 마십시오. 객체를 넘겨 주면 원래 객체의 참조는 모든 자손 범위에서 가능합니다 ....'$ scope.model = {idx : 0, isDirty : false}'...'model'을 지시어 범위로 전달한 다음'model.isDirty = true'는 참조 된 객체를 트리 위로 등록합니다. – charlietfl

+0

이 문이 "범위에있는 프리미티브를 사용하여 하위 범위를 통과하지 못하게합니다"라는 이유를 설명 할 수 있습니까? 이전에 읽었지만 왜 문제인지 명확하지 않습니다. – Darryl

+0

ok ....'var a = {}, b = a' ...'b'는'a'의 복사본이 아닙니다. 어떤 변화라도 다른 것에 영향을 준다. (그들은 같은 객체이다.)'var x = "foo", y = x' .... 원시 타입 인'y'는'x'의 복사본이고, 하나를 변경하면 다른 것에 영향을주지 않습니다. 따라서 중첩 스코프에서 레이어를 깊숙이 확장하면 오브젝트를 5 개 깊이로 업데이트하면 모든 참조가 트리 (동일한 객체) 위로 업데이트됩니다. 자식 프리미티브를 업데이트하는 것은 자식 범위 – charlietfl

답변

0

하여 컨트롤러가 (이 고립 된 경우에도)이 지침의 범위에 배치하게됩니다 임베디드 다음 작품 너무 :

<form name='theForm'>...</form> 

다음 지침 링크에서 :

$scope.$watch('theForm.$dirty', function() { 
    $scope.dirtyFlag = $scope.theForm.$dirty; 
    }); 
관련 문제