>

보기 내 모델에서 선언 한 함수를 사용할 수없는 문제가 발생했습니다. 나에게는 기능이 존재하는 것 같아서 콘솔에 존재하지 않는 이유가 콘솔에 있는지 확실하지 않습니다.

보기의 관련 부분을 추출했습니다 :

<div class="col-lg-6">
    <div class="page-header">
        <h3>Examens</h3>
    </div>
    <!-- ko foreach: examAttempts -->
    <div class="panel-header clickable" data-bind="click: () => toggleOpen()">
        <h3 class="d-block">
            Examen poging #<span data-bind="text: $index"></span>
            <span class="pull-right" data-bind="css: { fa: true, 'fa-chevron-left': !open(), 'fa-chevron-down': open() }"></span>
        </h3>
    </div>
    <div class="panel-body" data-bind="visible: open">
        <!-- ko foreach: questions -->
        <p>
            <b><span data-bind="text: formatQuestion($index)"></span></b>
            <br />
            <span data-bind="text: answer"></span>
            <br />
            <i>Beantwoord in: <span data-bind="text: time"></span> seconde(s)</i>
        </p>
        <!-- /ko -->
    </div>
    <br /><br /><br />
    <!-- /ko -->
</div>

이것은 내 뷰 모델입니다 (관련이없는 필드는 생략) :

class ExamAttempt {
    questions: KnockoutObservableArray<ExamQuestion>;
    open: KnockoutObservable<boolean>;
    constructor(questions: any) {
        this.questions = ko.observableArray<ExamQuestion>(questions);
        this.open = ko.observable<boolean>(false);
    }
    public toggleOpen(): void {
        this.open(!this.open());
    }
}
class ExamQuestion {
    question: KnockoutObservable<string>;
    answer: KnockoutObservable<string>;
    time: KnockoutObservable<number>;
    constructor(question: string, answer: string, time: number) {
        this.question = ko.observable<string>(question);
        this.answer = ko.observable<string>(answer);
        this.time = ko.observable<number>(time);
    }
    public formatQuestion(index: number): string {
        return `${index + 1}. ${this.question()}`;
    }
}
class EditUserProfileModel {
    examAttempts: KnockoutObservableArray<ExamAttempt>;
    constructor(params: any) {
        this.examAttempts = ko.observableArray<ExamAttempt>(params.examAttempts);
    }
}

바인딩 적용 ( params  페이지 모델이 직렬화되어 있음) :

ko.applyBindings(new EditUserProfileModel(params));

내가 얻는 오류 (글쎄, 그들은 함수가 정의되지 않았다고 말하지만 나에게해서는 안되는 것처럼 보인다) :

모든 제안은 대단히 감사하겠습니다.


  • 답변 # 1

    예. 알아 냈습니다. 유형에 문제가있었습니다. 비록 params.examAttempts 에도 불구하고   ExamAttempt 와 동일한 구조 및 동일한 필드를 갖습니다.  js/ts 클래스는 그것을 ExamAttempt 의 인스턴스로 바꾸지 않습니다. 함수가 ExamAttempt 에 정의 되었기 때문에 여기서 문제가되었습니다.  수업). 내 잘못이야!.

    @adiga, 바이올린을 만들 시간을 내 주셔서 감사합니다.

    수정하기 위해 다음 줄을 변경했습니다 :

    this.examAttempts = ko.observableArray<ExamAttempt>(params.examAttempts)
    
    

    으로 :

    this.examAttempts = ko.observableArray<ExamAttempt>(params.examAttempts.map((ea: any) => {
        let questions = ea.questions.map((eaq: any) => {
            return new ExamQuestion(eaq.question, eaq.answer, eaq.time);
        });
        return new ExamAttempt(questions);
    }));
    
    

관련 자료

  • 이전 java - HashSet 컬렉션을 올바르게 사용하도록 hashCode () 메 토스를 수정하는 방법
  • 다음 windows runtime - XAML에서 슬라이더의 툴팁 편집