0

꽤 일반적인 질문이 있다고 생각하지만 특정 응용 프로그램 용입니다. 간단히 드롭 다운의 초기 값과 동일한 드롭 다운에 사용자 정의 속성을 설정하는 것이 가능한지 알고 싶습니다. ,Knockout.js - 모델에 영구적으로 바인딩하지 않고 드롭 다운의 속성 설정

<select data-bind="options: availableSlots, attr: { preset: SlotPosition }, event: {'change', myChangeRoutine} " ></select> 

을 위의 예에서 :이 값은 녹아웃 뷰 모델 값에서 구속 될 것이다,하지만 난 그것을 변경하는 경우, 그 속성의 값이 변경되지 않도록이 영구적으로 구속하고 싶지 않아 preset이 내 속성이며 내 뷰 모델에있는 SlotPosition으로 설정하고 드롭 다운이 처음에 자동으로 설정됩니다. availableSlots은 ko.observableArray()로 viewmodel에 반환하는 슬롯 1 - x 개수의 항목이있는 MVC 서버 측에서 만든 SelectListItem입니다. (그것은 주어진 값에 대해 설정해야합니다 나는 참으로 Selected를 설정 서버 측 코드이며, 옵션을 구축 할 수 있습니다.)

위의 예는 내 모델의 값 SlotPosition 내 속성 preset을 결합하는 것 , 그러나 나는 영구적으로 바인딩하는 대신 변경 될 때까지 그 값을 기억하기를 원한다. 내가 가지고있는 문제는 myChangeRoutine에서, preset의 값은 이미 드롭 다운이 변경된 것입니다. 드롭 다운의 값을 변경하고 myChangeRoutine이 실행될 때 이전 값을 사용하여 작업을 수행 할 수 있도록이 기능이 필요합니다.

+1

가입하여 함께 나는 이것이 당신이 여기에서 찾고있는 것은 내가 그렇게 생각 바이올린 링크 jsfiddle.net/supercool/74dh736s/11 –

+0

입니다 바랍니다. 이 코드를 수정하여 http://jsfiddle.net/navyjax2/Ls5aw9xs를 작성하여 코드에서 수행하려고했던 작업과 일치시킵니다. 그러나 어떤 이유로, 당신의 기준선을 사용하여 작동하지만, myChangeRoutine이 실제 코드에서 실행될 때까지 새로운 값을 여전히'self.SlotPosition()'에 설정합니다. 그래서 맥스가 제안한 방식대로갔습니다. 최종 코드 http://jsfiddle.net/navyjax2/7kkuwsLa/ – vapcguy

+0

'vapcguy'를 보시면 더 좋은 방법으로 이것을 얻을 수 있습니다 (더 깨끗한 방법). 게시 된 답변을 확인하십시오. 'MaxBrodin' 언급'peek()'은 정말 유용하지만, 당신의 경우 코드를 줄이는 더 좋은 대안이 있습니다. –

답변

1

단지 SlotPositionko.observable이 아닌 단순한 일반 값으로 설정하면 한 번 바인딩됩니다. attr { preset : SlotPosition.peek() }을 사용하십시오 (documentation 참조).

+0

불행히도, 데이터베이스에 다시 위치를 저장해야하므로 일반 값으로 만들 수 없습니다. 데이터베이스에 바인딩되지 않은 뷰 모델에 상수를 추가 하시겠습니까? 그것을 시도했다 - 나는 아직도 그것을 'self.SlotPosition'으로 초기화해야 할 것이고 여전히 새로운 값으로 설정한다. 그리고 당신이 제안한 것처럼'.peek()'를 인라인으로 설정하려고 시도했지만, 여전히 이전 값을 유지하는 대신 새로운 값으로 프리셋을 설정합니다. – vapcguy

+0

실제로, 필자가 제안한대로, self.SlotPosition.peek()로 초기화해야 할 때 뷰 모델에 추가 된 상수'self.Preset'를'self.SlotPosition'에 초기화했습니다. . 이것은 효과가있다! 많은 감사합니다! – vapcguy

+0

그래서 미래에 이것을 발견 한 사람이라면 어떤 것이 효과가 있었는지를 요약하기 위해 드롭 다운의 '데이터 바인딩'에'attr {preset : Preset} '을 사용하고'self.Preset = self.SlotPosition.peek()'를 사용했습니다. 내 뷰 모델에서. – vapcguy

1

이것은 훨씬 간단한 방법으로 모든 변경 이벤트 및 다른보기를 복잡하게 만드는 필요성을 없앨 수 있습니다.이

var ViewModel = function() { 
    var self = this; 

    self.availableSlots = ko.observableArray(slots); 
    self.Id = '999'; 
    self.SlotPosition = ko.observable();  
    self.Preset = ko.observable(1); 

    self.SlotPosition.subscribe(function(newVal){ 
     if(newVal == self.Preset()) return false; 
     var newVal = self.SlotPosition(); 
     alert('newVal: ' + newVal); 
     alert('oldVal: ' + self.Preset()); 
     // Then, I find my other dropdown from the next model 
     // using the newVal, and set it to oldVal 
     // After doing you work set the newVal to self.Preset 
     self.Preset(newVal); 
    }); 

}; 
ko.applyBindings(new ViewModel()); 

보기 : 단지 우리가 필요로하는 모든 사용하는 subscribe

보기 모델 인 사용 바이올린을 작업 엿보기없이

<div> 
    <select data-bind="options: slots, optionsText: 'Text', optionsValue: 'Value', value: SlotPosition"> </select> 
</div> 

구독 here

슬쩍 작업 바이올린이 here

+0

명성! 변경 이벤트와 기능이있을 때 당신이 가진 것 같은데요 .subscribe()입니다. 거기에 선호의 문제, 내 생각 엔. 불행히도, 그 아이디어는 "1"이 아닌 슬롯의 숫자가 될 수 있기 때문에 "Without peek"에서했던 것처럼 "Preset"을 "1"로 설정할 수 없습니다. 그 값은 처음에는'.SlotPosition'과 동일해야만했기 때문에'.peek()'를 사용해야했기 때문에, 아니면 나를 위해 버그가 발생했기 때문에 초기로드에 대한 모든 드롭 다운과 채우기'프리셋 '드롭 다운 값에서 자바 스크립트를 사용하여 수동으로. 어쩌면 다른 방법이 있었지만 늦게까지 작업 할 때 ... – vapcguy

+0

JavaScript를 사용하여 속성을 설정하거나 설정하는 것과 비교하여 값을 설정하는 데 모델을 사용할 수있는 방법이 마음에 들었습니다. 객체가 끝날 때까지 저장되지 않기 때문에 구현에 의존하지 않습니다. – vapcguy

+1

무엇이 필요한 것은 단지 조건 일뿐입니다. 이 (http://jsfiddle.net/supercool/7kkuwsLa/6/)을 살펴보고 관찰 번호에 고정 숫자를 전달하지 않고 확인하십시오. 코멘트 2 잘 ko 작품 (보기 모델은 볼 수 동기화됩니다)에 관한. 한가지는 여기 jquery와 코를 섞지 않는다 (대부분 항상 그렇지는 않다). 당신의 일을하는 많은 옵션이 있습니다. 건배 –

관련 문제