데이터 바인딩없이 값 렌더링


87

AngularJS에서 양방향 데이터 바인딩없이 값을 어떻게 렌더링 할 수 있습니까? 성능상의 이유로이 작업을 수행하거나 특정 시점에서 값을 렌더링 할 수도 있습니다.

다음 예제는 모두 데이터 바인딩을 사용합니다.

<div>{{value}}</div>

<div data-ng-bind="value"></div>

데이터 바인딩 value 없이 어떻게 렌더링 합니까?


당신의 입력과 출력은 무엇입니까. plz 설명
Nitish Kumar

3
귀하의 예는 실제로 단방향 데이터 바인딩입니다 (모델 변경->보기 업데이트). ng-model양방향 데이터 바인딩을 제공합니다 : 모델 변경->보기 업데이트,보기 변경-> 모델 업데이트.
Mark Rajcok 2013 년

1
업데이트되었습니다. 미안 내가 더 전혀 데이터가 결합되지하려는 의미
Blowsie

10
나는이 질문이 끔찍하거나 반대 할 가치가 있다고 생각하지 않습니다. 불필요한 감시를 방지하기 위해 데이터 바인딩을 비활성화하는 것이 실제로 일반적입니다.
OverZealous 2013 년

4
업데이트 :이 기사를 읽는 사람이라면 누구나이 비디오가 매우 유용하다는 것을 알게 될 것입니다. youtube.com/watch?v=zyYpHIOrk_Y
Blowsie 2014-01-24

답변:


141

Angular 1.3 이상

1.3에서 Angular는 다음 구문을 사용하여이를 지원했습니다.

<div>{{::message}}</div>

이 답변 에서 언급했듯이 .


Angular 1.2 이하

이것은 간단하며 플러그인이 필요하지 않습니다. 이것 좀 봐.

이 작은 지침은 달성하려는 것을 쉽게 달성 할 수 있습니다.

app.directive('bindOnce', function() {
    return {
        scope: true,
        link: function( $scope ) {
            setTimeout(function() {
                $scope.$destroy();
            }, 0);
        }
    }
});

이렇게 한 번 묶을 수 있습니다

<div bind-once>I bind once - {{message}}</div>

평소처럼 묶을 수 있습니다

<div ng-bind="message" bind-once></div>

데모 : http://jsfiddle.net/fffnb/

여러분 중 일부는 angular batarang을 사용하고있을 수 있습니다. 주석에서 언급했듯이이 지시문을 사용하면 요소가 바인딩되지 않은 경우 여전히 바인딩으로 표시됩니다. 이것은 요소에 연결된 클래스와 관련이 있다고 확신합니다. 이것을 시도하면 작동합니다 (테스트되지 않음) . 그것이 당신을 위해 일했다면 의견으로 알려주십시오.

app.directive('bindOnce', function() {
    return {
        scope: true,
        link: function( $scope, $element ) {
            setTimeout(function() {
                $scope.$destroy();
                $element.removeClass('ng-binding ng-scope');
            }, 0);
        }
    }
});

@ x0b : OCD가 있고 빈 class속성 을 제거하려면 다음을 수행하십시오.

!$element.attr('class') && $element.removeAttr('class')

im은 아직 플러그인을 테스트하지 않았지만 AngularJS 크롬 도구가 예와 같이 bind-once 요소를 바인딩으로 표시하지 않을 것이라고 가정합니다. 흥미로운 접근 방식, 곧 두 접근 방식을 모두 테스트 할 것입니다.
Blowsie

이 참조 -이 바인딩으로 모두를 보여줍니다 dl.dropboxusercontent.com/u/14037764/Development/stackoverflow/...
Blowsie

1
의심 할 여지없이 ng-binding 클래스라면 쉽게 제거 할 수 있기 때문입니다
iConnor

4
이것은 bindonce 플러그인보다 위대하고 훨씬 간단합니다. 스코프를 파괴하기 전에 조건을 기다리는 기능을 추가했는데 정말 도움이되었습니다. 감사.
Yaron 2014 년

1
@Connor 동의하지 않습니다. 예를 들어, REST API에서 비디오 개체 ($ scope.video)를 받고 있는데 비디오 제목 ($ scope.video.title)의 일회성 바인딩을 원합니다. 컨트롤러의 스코프에 추가하기 전에 프라 미스를 해결하더라도 DOM에서 ng-bind = "video.title"bind-once를 선언해야합니다. 이제 promise가 해결되기 전에 video.title이 정의되지 않고 video.title이 정의되기 전에 범위가 파괴됩니다. 이에 대한 해결책은 일부 유형의 로딩 / 초기화 플래그 인 ng-if = "someLoadingFlag"로 요소를 래핑하는 것이지만 패턴이 좋지 않습니다.
SirTophamHatt

49

Angular 1.3 (베타 10부터 시작)에는 일회성 바인딩이 내장되어 있습니다.

https://docs.angularjs.org/guide/expression#one-time-binding

일회성 바인딩

::로 시작하는 식은 일회성 식으로 간주됩니다. 일회성 표현식은 안정되면 재 계산을 중지합니다. 표현식 결과가 정의되지 않은 값인 경우 첫 번째 다이제스트 이후에 발생합니다 (아래 값 안정화 알고리즘 참조).


1
이 대답은 계속됩니다. 칼을 충분히 칭찬 할 수 없습니다! 이 기능이 합리적 일 때마다 공격적으로 사용하는 것이 좋습니다.
XDS

1
와, 스크롤을 내려서 정말 기쁩니다. 나는 Connor에게 그의 대답에서 이것을 참조하도록 요청할 것입니다.
JSager jul.

2000 줄의 테이블 / 목록이 있고 일회성 바인딩 연산자를 사용하면 목록을 처음 표시 / 렌더링 할 때 앱이 매우 느려집니다. 너무 느려서 브라우저가 스크립트 실행을 중지하고 싶은지 두세 번 묻습니다!
Billy G

@ billy-g 문제를 설명하는 jsfiddle 또는 plunker를 게시 할 수 있습니까?
James Daily

@James Daily : 여기에 "정상적인"케이스 plnkr.co/edit/rCRP0T5fSgNIllx7F27y 와 여기에 "일회성 표현"케이스 plnkr.co/edit/Rd5VBVjkcX3sTJYGypUr이 있지만 ... 나는 그것을 재현 할 수 없습니다. 어쨌든, 그렇지 빨리 "한 번 표현"을하고 나는 내 환경에서 발생하는 이유를 찾기 위해 더 조사를해야 할 (나는 AngularJS와 1.3 베타 18 사용)
빌리 G

20

bindonce 모듈을 사용하십시오 . JS 파일을 포함하고이를 앱 모듈에 대한 종속성으로 추가해야합니다.

var myApp = angular.module("myApp", ['pasvaz.bindonce']);

이 라이브러리를 사용하면 처음 초기화 될 때 한 번만 바인딩 된 항목을 렌더링 할 수 있습니다. 이러한 값에 대한 추가 업데이트는 무시됩니다. 렌더링 된 후 변경되지 않는 항목에 대한 페이지의 시계 수를 줄이는 좋은 방법입니다.

사용 예 :

<div bo-text="value"></div>

이렇게 사용하면 아래 속성 value이 사용 가능 해지면 설정되지만 시계는 비활성화됩니다.


1
나는 "당신 자신의 지시문을 작성하라 ..."라는 답을 쓰려고했지만, 누군가 이미 우리를 위해 그렇게 한 것 같습니다.
Mark Rajcok 2013 년

3
Bindonce는 .NET과 같은 내장 옵션 라이브러리로 포함될 수있을만큼 유용합니다 $resource.
OverZealous 2013 년

6
이것은 내가 찾던 것입니다. 그러나 나는 이와 같은 것이 앵귤러에 내장 될 것으로 기대하고있었습니다!
Blowsie 2013-09-13

7

@OverZealous와 @Connor 답변 비교 :

기존 ngRepeat of angular : 2000 행의 경우 15 초, RAM의 420mo ( 플 런커 )

ngRepeat 및 @OverZealous 모듈 사용 : 2000 행에 7 초, RAM 240mo ( Plunker )

ngRepeat 및 @Connor 지시문 사용 : 2000 행의 경우 8 초, RAM의 500mo ( Plunker )

Google Chrome 32로 테스트했습니다.


1
angular-once비교해 도 좋을 것 같습니다 . 감사.
alecxe 2014 년

@alecxe : AngularJS 1.3의 안정적인 빌드가 게시 될 때 테스트를 할 계획이었습니다.
가브리엘

감사합니다. angular-once패키지 를 포함하는 것을 잊지 마세요 (여기에 대체 옵션으로 게시했습니다).
alecxe 2014 년

5

대안으로 angular-once패키지가 있습니다.

AngularJS를 사용하고 성능 문제가 있고 많은 읽기 전용 데이터를 표시해야하는 경우이 프로젝트가 적합합니다!

angular-once실제로 영감을 받았으며 bindonce유사한 once-*속성을 제공 합니다.

<ul>
    <li ng-repeat="user in users">
      <a once-href="user.profileUrl" once-text="user.name"></a>
        <a once-href="user.profileUrl"><img once-src="user.avatarUrl"></a>
        <div once-class="{'formatted': user.description}" once-bind="user.description"></div>
    </li>
</ul>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.