2011-03-20 4 views
1

다음 knockout.js 코드가 있습니다.knockout.js 바인딩 인스턴스를 추가하고 바꾸는 방법은 무엇입니까?

다음과 같습니다.

var itemLine = function() { 
    this.itemId = ko.observable(); 
    this.itemType = ko.observable(); 
    ///this.otherFields = = ko.observable();.... 
}; 

var itemSet = function() { 
    this.items = ko.observableArray(_.map(initialData, function (item) { 
     var newItem = new itemLine(); 
     newItem.itemId(item.itemId); 
     newItem.itemType(item.itemType); 
     return newItem; 
    })); 

    this.current = new itemLine(); 

    // works, but it req duplication of all my fields 
    this.add = function() { 
     var newItem = new itemLine(); 
     newItem.itemId(this.current.itemId()); 
     newItem.itemType(this.current.itemType()); 

     this.items.push(newItem); 
     this.current.itemerId(""); 
     this.current.itemType(""); 
    }; 

    // doesn't work 
    this.add = function() { 
     this.items.push(this.current); 
     this.current = new interviewLine(); // bindings are lost 
    }; 

두 번째 구현이 잘못되었습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?

답변

1

현재 두 번째 추가에서는 관측 대상을 실제로 업데이트하지 않고 새 관측 대상으로 교체합니다.

나는 this.current를 관찰 가능하게 만듭니다. 그런 다음 추가의 두 번째 버전에서는 관찰 가능을 설정하는 것처럼 현재 값을 새 값으로 설정합니다.

그래서, 당신의 항목 집합의 생성자에서 당신이 초기화 것이다 this.current 같은이 같은

this.current(new interviewLine()); 

뭔가 :

this.current = ko.observable(new itemLine()); 

그런 다음, 두 번째 추가 기능에, this.current 같은 설정 : http://jsfiddle.net/rniemeyer/j72NU/

당신이하려는 일에 근접합니까?

+0

감사합니다. 그게 내가하려는 일입니다. "현재"편집기를 템플릿으로 사용하지 않고도이 작업을 수행 할 수 있습니까? –

+0

예, http://jsfiddle.net/rniemeyer/KSPGA/와 같습니다. 바인딩은 dependentObservables로 구현되므로 바인딩에서 current()에 액세스하면 현재 변경 사항을 언제든지 다시 실행하고 원하는 결과를 제공해야합니다. –

관련 문제