2012-05-17 11 views
0

몇 가지 방법을 추가하고 싶습니다. 그리고 this 지시문은 나를 도울 수 없습니다.knockout.js에서 계산 가능한 관측 값을 구현하는 방법

var viewModel = function() { 
    firstName = ko.observable("Mike"); 
    lastName = ko.observable("Rassel") 
    //fullName = ko.computed(function() { 
     //return firstName() + " " + lastName(); }, viewModel); 
} 

viewModel.fullName = ko.computed(function() { 
    return this.firstName() + " " + this.lastName(); }, viewModel); 

DEMO : 2.1.0의 업무와 지역에 http://jsfiddle.net/gJUqK/

.

답변

4

firstName, lastNamefullNamemyViewModel 인스턴스의 속성이어야합니다.

the documentation에서 설명한대로 작동합니다. 관찰 가능 콜백 함수 this이 다른 것을 가리키기 때문에 self이 추가되었습니다.

function myViewModel() 
{ 
    var self = this; 

    this.firstName = ko.observable("Mike"); 
    this.lastName = ko.observable("Rassel"); 

    this.fullName = ko.computed(function() { 
     return self.firstName() + ' ' + self.lastName(); 
    }) 
} 

ko.applyBindings(new myViewModel()); 

여기에 사용 : http://jsfiddle.net/gJUqK/1/

+0

외부에 없습니다 – FreeVice

+0

@FreeVice 외부에 없습니까? 나는 따르고 있지 않다. –

+0

죄송합니다. 누군가 내 질문을 인식 할 수 없도록 수정했습니다. – FreeVice

1

viewModel을 호출하는 방식으로 thisfullName 함수의 전역 개체에 바인딩됩니다.

var ViewModel = function() { 
    this.firstName = "Mike"; 
    this.lastName = "Rassel"; 
} 

ViewModel.prototype.fullName = function() { 
    return this.firstName + " " + this.lastName; 
}; 

var view = new ViewModel(); // Call ViewModel with new 
console.log(view.fullName()); // Prints "Mike Rassel" 

내가 녹아웃 물건을 이해하지 않는, 그러나 희망이 가까이 솔루션에 당신을 얻을해야합니다

당신은 viewModel 생성자를 만들고 프로토 타입에 fullName를 추가하여이 문제를 해결하려면 시작할 수 있습니다.

+0

귀하의 제안이 도움이 될 것입니다. Hovewer 프로토 타입은 그러한 문제를 해결하기위한 일반적인 요소가 아닙니다. 주요 이유 -보기에서 함수를 참조하면이 부분이 손실 될 수 있습니다. 'var self = this;'그리고'this' 대신'self'를 사용하는 것이 더 보편적 인 해결책입니다. – Romanych

+0

@Romanych 당신이 @ Jack의 답변과 비슷한 패턴을 말하는 것으로 생각합니다. 프로토 타입 경로의 한 가지 장점은'fullName'은 함수이고 함수의 출력이 아니라는 것입니다. (여기서 "if"는 정확히 knockout.js가 여기서 무엇을하는지 잘 모르므로) 프로토 타입에 추가하면 메모리가 줄어 듭니다 왜냐하면'ViewModel'의 모든 인스턴스가 단일 선언을 공유하기 때문입니다. 객체 자체 내에서 정의하고'self'를 사용하여 객체를 다시 참조한다는 것은 각 인스턴스가 자체적으로'fullName' 정의를 갖는다는 것을 의미합니다. –

+1

fullName은 바인딩이 작동하는 데 필요한 'ko.computed'이어야하며, 다른 것들 사이에서 종속 속성을 추적합니다. –

관련 문제