2012-07-17 2 views
52

녹아웃을 사용할 때 간단한 함수가 아닌 읽기 전용 계산 된 관찰 값을 사용하면 어떤 점이 유리합니까?녹아웃 : 계산 된 관찰 가능 대 함수

예를 들어, 다음의 ViewModel 생성자와 HTML 코드 조각을 가지고 :

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

모든 것이 여기에 예상대로 작동하는 것 같다, 그래서 내가 대신 사용해야하는 이유가있다 :

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

http://knockoutjs.com/documentation/computedObservables.html의 설명서에는 "... 선언적 바인딩이 단순히 계산 된 관찰 가능 정보로 구현됩니다"라는 내용이 있습니다. 그렇기 때문에 내 뷰 모델에서 명시 적으로 사용할 필요가 있다는 의미입니까?

답변

71

계산 된 관측 가능 함수의 유일한 목적이 함수에 대한 간단한 바인딩을 수행하는 것이라면 함수를 사용하는 것이 동일합니다. 바인딩은 종속성을 추적하기 위해 계산 된 관찰 가능 내부에서 구현되므로 관찰 내용 중 하나가 변경되면 바인딩을 다시 트리거합니다. 여기

계산 관찰 가능한 대 기능

  • A를 관찰 캐시 계산 된 값에 대해 고려해야 할 몇 가지, 그래서 만들 때와 종속성이 업데이트 될 때 그것은 단지 업데이트됩니다. 일반 함수의 경우 매번 논리를 실행해야합니다. 많은 것들이 그 값에 의존한다면 (콜렉션의 각 항목이 부모로부터의 값에 대해 바인딩이라고 말하면),이 논리는 계속해서 반복적으로 실행될 것입니다.

  • JavaScript에서 다른 관측 가능 물처럼 계산 된 관측 값을 자유롭게 사용할 수도 있습니다. 이것은 그것들에 대한 수동적 인 서브 스크립 션을 생성 할 수 있고 다른 계산으로부터 그것들에 의존 할 수 있다는 것을 의미합니다 (함수 호출은이 의존성을 생성합니다). ko.utils.unwrapObservable과 같은 KO의 일반적인 유틸리티 메소드를 사용하여 함수로 호출해야하는지 또는 값을 검색하지 않아야하는지 일반적으로 판단 할 수 있습니다.

  • 궁극적으로 값을 서버에 전달하려는 경우 계산 된 관찰 가능 항목이 자연스럽게 JSON 출력에 표시되는 반면 일반 함수의 결과 값은 JSON으로 변환 될 때 사라집니다 (먼저 해당 기능에서 속성을 채우기 위해 더 많은 작업을 수행해야합니다.

+0

위대한 답변 : thanks! – Duncan

+1

좋은 답변입니다. 때로는 전체 논리를 실행할 때마다 계산 대신 함수를 사용합니다. –

+1

계산 된 관찰 대상이 다른 관찰 대상에 의존한다는 것을 어떻게 알 수 있습니까? 그 함수를 구문 분석합니까!? - knockout 소스 코드를 읽을 시간. – zod