2016-08-24 11 views
1

다중 선택 및 텍스트 상자가 포함 된 모델이 있습니다.녹아웃의 종속성 확인이 작동하지 않습니다.

아무 것도 입력되지 않은 경우 유효성을 검사하지만 적어도 하나가 채워지면 유효성 검사 오류가 나타나지 않도록하고 싶습니다. (클릭 한 항목 중 하나의 항목 또는 일부 텍스트). 내가 성공하지 가지의 수천을 시도 plnkr.co/edit/pwKohFTmLPW1BKNwHxWR?p=preview

:

은 여기 작업 plunkr 있습니다. 의 핵심 문제는 self.isValid() 유효성 검사 기능 SubscribersOrEmails

을 유발하지 않는 것은 현재 내가이 있습니다

var ReportSchedule = function() { 

    self.Subscribers = ko.observableArray().extend({ required: { onlyIf: function() { return self.SubscribersOrEmails === 0; } } }); 
    self.Emails = ko.observableArray().extend({ required: { onlyIf: function() { return self.SubscribersOrEmails === 0; } } }); 
    self.EmailText = ko.observable(); 

    self.SubscribersOrEmails = ko.computed(function() { 
      var counter = 0; 
      if (self.Emails != null && self.Subscribers != null) { 
       counter = self.Emails().length + self.Subscribers().length; 
      } 
      console.log("counter: " + counter); 
      return counter; 
     }); 
} 

내가 정의 검증 및 태양 아래 모든 조합을 시도했다.

다음에 시도 할 아이디어가 있습니까?

나는이 그것을 해결해야 녹아웃 v3.2.0 베타

+0

{onlyIf : function() {return self.SubscribersOrEmails === 0; } observable을 대괄호 self.SubscribersOrEmails()로 호출해야합니다. –

+0

저는 계산 된 함수가 올바르지 않다는 것을 확신합니다. 온라인에서 찾은 사례에는 대괄호가 필요하지 않습니다. 대괄호를 추가하면 self.SubscribersOrEmails가 함수가 아닙니다. – Nick

+0

ko.pureComputed가 함수가 아닙니다. 나는 다른 녹아웃 버전이라고 생각합니다. 하지만 작동하지 않는 비슷한 방법을 시도했습니다. – Nick

답변

0

을 사용하고 있습니다. computed은 변수가 존재할 것으로 예상하고 유효성 검사 루틴은 computed이 존재하기를 기대하므로 확장에서 변수를 분리해야합니다.

변수가 존재하지만 Knockout이 종속성을 알아 내지 못하게하는 계산을 확인했습니다.

필수 인수는 self.subscribersOrEmails 일 수 있으므로 함수에 포함 할 필요가 없습니다.

self.Subscribers = ko.observableArray(); 
self.Emails = ko.observableArray(); 
self.EmailText = ko.observable(); 
self.Name = ko.observable(); 

self.SubscribersOrEmails = ko.computed(function() { 
    console.log("validation "); 
    var counter = 0; 

    console.log(self.Emails); 
    console.log(self.Subscribers); 
    counter = self.Emails().length + self.Subscribers().length; 
    console.log("counter: " + counter); 
    return counter == 0; 
}); 

self.Subscribers.extend({ 
    required: { 
    onlyIf: self.SubscribersOrEmails, 
    params: 'Subscribers' 
    } 
}); 
self.Emails.extend({ 
    required: { 
    onlyIf: self.SubscribersOrEmails, 
    params: 'Emails' 
    } 
}); 

또한 : 당신은 Emails 덮어 쓰기 한 대신 여기에 그 내용을 설정 : 여기

self.populateEmails = function() { 
    self.Emails(self.getEmailsFromText(self.EmailText())); 
} 

을 그리고 :

$.each(self.schedulesViewModel.Schedules, function(index, schedule) { 
    var emailsArray = schedule.getEmailsFromText(schedule.EmailText()); 
    schedule.Emails(emailsArray); 
}); 

오류 메시지가 삭제되지는 결코 더 코드가 없기 때문에 그들을 지우십시오.

+0

내 plunkr을 확인하는 데 많은 시간이 걸릴 것입니다. "디버그 정보"는 유효하고 정확하지만 유효성 검사 규칙은 무시됩니다. – Nick

+0

@ 닉 업데이트 된 (부분적) 답변을 참조하십시오. –