2013-04-28 3 views
4

녹아웃/breeze를 사용하여 프로젝트를 개발합니다.관찰 대상을 변경된 것으로 표시하도록 강제 녹아웃

녹아웃을 변경하여 관찰 가능을 표시 할 수 있는지 알고 싶습니다 (포커스가 필드에 있더라도). 나의 부하는 그가 날짜를 변경하기 시작할 때마다 버튼을 저장하는 기능이 있음을 사용자에게 알려주는 역할을합니다. 예를 들어 날짜가있는 입력 필드가 있습니다. 사용자가이 필드에서 날짜를 편집하기 시작합니다. 관찰 가능 항목은 사용자가 필드의 포커스를 벗어날 때만 새 인코딩 날짜를 해석해야합니다. 하지만 입력란에 무언가를 입력하자마자 내 Save button을 보여주고 싶습니다. 나는 분명히 희망한다.

ko.bindingHandlers.dateRW = { 
    //dateRW --> the 'read-write' version used both for displaying & updating dates 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     var observable = valueAccessor(); 
     var value = ko.utils.unwrapObservable(valueAccessor); 
     //handle the field changing 
     ko.utils.registerEventHandler(element, "change", function() {     
      var myDate = moment($(element).val(), "DD/MM/YYYY"); 
      observable(myDate.toDate()); 
     }); 
     //ko.utils.registerEventHandler(element, "keyup", function() { 
     // As soon as user begin to type something, I would like to show my save button 
     //}); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     var date = (typeof value !== 'undefined') ? moment(value) : null; 
     var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : ''; 
     $(element).val(dateFormatted); 
    } 
}; 

그리고 내보기 : 나는 정의 bindingHandlers을 사용하고 있기 때문에

<input type="text" data-bind="dateRW: myDate" /> 

불행하게도 valueUpdate: 'afterkeydown' 작동하지 않습니다

여기 내 입력에 편집 날짜를 돌보는 내 bindingHandlers입니다.

누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

감사합니다.

답변

9

다른 의견에 observable.valueHasMutated()

편집 은 당신이 당신이에 사용할 막아 구속력 언급 시도 'context.hasChanges()'(브리즈의 EntityManager에서 업데이트되는?).

Breeze가 Knockout 관찰 가능 알림을 구독하여 hasChanges을 업데이트하지 않는다고 생각합니다. 나는 실제로 관측 가능한 설정 함수를 감싸고 값이 실제로 변화하고 있는지 확인하기 위해 검사를한다고 생각한다. 다른 말로하면 나는 당신이 실제로 관찰 값 값을 (그리고 다시) 변경하여 hasChanges()을 트리거해야한다고 생각합니다.

또 다른 (좋지 않은) 옵션은 관찰 가능 객체의 부모 객체로 돌아가서 EntityAspect을 얻는 것입니다. 그런 다음 'setModified()'을 부를 수 있습니다. 바인딩 처리기에서이 모든 작업을 수행하는 것은 나쁜 생각 인 것 같습니다. 바인딩하려는 관찰 대상이 Breeze 엔터티의 속성이라고 가정하기 시작합니다.

마이클의 대답과 비슷한 옵션을 고려하는 것이 가장 좋을 수도 있습니다. (경우와 바인딩 처리기에 valueHasMutated() 전화로 돌아갈 - 당신은 다음 중 하나 마이클 알 수 있다는 바인딩 keyup을 사용하거나 관측 가능한 날짜에 위의 또 다른 subscribe를 추가 할 수

var saveEnabled = ko.observable(false); 
context.hasChanges.subscribe(function() { saveEnabled(true); }); 

: 아마도 같은 당신의 ViewModel에 saveEnabled() 관찰을 만들 당신은 그것을 찾을 수 있습니다).

+0

나는 그것을 시도하지만 난 항상 오류가 발생했습니다 : ovservable이 방법이 없습니다. 왜 그런가? – Bronzato

+0

위의 제안 사항을 추가했습니다. – Brendan

0

저장 버튼에 이미 관찰 가능 항목이 연결된 enable 바인딩이 있다고 가정하고 saveEnabled으로 전화를 걸면 이벤트 핸들러를 사용하여 트리거 할 수 있어야합니다. 넉 아웃은 event 바인딩을 포함합니다.

<input type="text" data-bind="dateRW: myDate, event: {keyup: function() {saveEnabled(true);}}">

+0

내 savebutton은 바로 breeze context.hasChanges()에 의존하기 때문에 valueHasMutated (예 :)와 같은 깨끗한 솔루션을 찾고 있습니다. 지금은 나에게 적합하지 않습니다. – Bronzato

관련 문제