2013-07-04 8 views
2

AngularJS를 사용하면 모델이 더러워 져서 서버에 저장해야합니까? 사용자가 "저장"버튼을 클릭하는 것 외에? AngularJS 관측 값 관찰

나는 $ 시계를 사용하여 생각하지만, 데이터가 처음로드 될 것은 화재가 사방 해킹이와 끝까지 있도록 : 또한 $ 트리거 이벤트를 방출 할 수

How do I ignore the initial load when watching model changes in AngularJS?

세이브,하지만 당신은 때

  1. 세트는 범위의 속성은
  2. $ 그 범위
  3. 캐치 전자에 이벤트를 방출 변경 단계에서 만든되기 전에 부모 컨트롤러에서 $에와 환기 및 순서에서 속성

보고, 이벤트 핸들러는 그것이로 범위 속성을 볼 수 3 단계에서 선언 1.

내가 여기 함께 예를 넣었습니다 : 당신이 다음 foo는, 표시 줄을 클릭하면, 다음으로 foo 다음 바, 당신은 이벤트 리스너가 재산 뒤에 한 단계는 항상 것을 볼 수 있습니다

http://plnkr.co/edit/Il9TzUdCSBdewCxIKARZ

.

범위 이벤트가 다이제스트주기와 관련하여 처리 될 때와 관련이 있다고 가정하지만 자바 스크립트의 법칙을 위반하는 것으로 보입니다. 너가 그것을 바꿀 때 재산이 변화하지 않는다 그래야 각각 녀석은 그것을 만들 n 것을 어떻게 처리 했는가?

이렇게하면 이전 데이터를 항상 저장할 때 머리가 긁혔습니다.

빠른 수정은 $ 지연을 사용하여 저장을 "지연"하는 것으로, 요약주기가 끝날 때까지 가정합니다. 이것이 작동하는 동안, 그것은 더러워 보인다. 무슨 일 이니? 범위 변경이 이벤트 처리기에 표시되지 않으면 이벤트가 쓸모없는 것처럼 보입니다. 그렇습니까?

깨끗한 방법이 있습니까?

감사합니다.

답변

1

이것은 양방향 바인딩이 $digest 루프까지 업데이트되지 않기 때문에 발생합니다. 이는 $emit 이후 발생합니다.

데이터에서 $watch을 사용하여 저장을 실행하는 것이 좋습니다.

// Controller 
$scope.$watch('message', function(newVal, oldVal) { 
    if (newVal === oldVal) { 
    return; 
    } 
    // Handle update... 
}); 

또 다른 옵션은 개체를 문자열 대신 지시문에 전달하는 것입니다. 이렇게하면 $on 청취자는 올바른 데이터에 액세스 할 수 있습니다. 예를 들어

:

// Controller 
$scope.messageData = {message: "Initial message"}; 

// HTML 
<div set-message="messageData">...</div> 

// Directive 
scope: { 
    messageData: "=setMessage" 
}, 
link: function(scope) { 
    scope.setMessage = function(message) { 
    scope.messageData.message = message; 
    scope.$emit('messagechange'); 
    }; 
} 
관련 문제