2013-07-12 2 views
1

이 간단한 테스트가 런타임 오류를 발생시키는 이유를 이해하는 데 실제 문제가 있습니다.녹아웃 - JavaScript 런타임 오류 : 개체가 'Level'속성 또는 메서드를 지원하지 않습니다.

...

JavaScript runtime error: Object doesn't support property or method 'Level' 

I을 나는, 나는, 편지에 대한 설명서를 따랐습니다 녹아웃 계산 재산 '레벨'내 FilterClause 객체의 일환으로있어 아직 여전히 런타임 오류가 발생합니다 계산 된 특성 함수가 선언 된 시공시 인스턴스화되지 않은 오브젝트와 관련이 있다고 생각하십시오. 그러나 그것은 적어도 편지에 대한 녹아웃 문서를 따르는 것으로 보인다.

혼란스러워 !! 계산 내부의 당신은 상황에 문제가

var FilterClause = function (json, parent) { 
    this.FilterClauseID = ko.observable(); 
    this.Type = ko.observable(); 
    this.Left = ko.observable(); 
    this.Right = ko.observable(); 
    this.ParentID = ko.observable(); 
    this.Parent = ko.observable(parent); 
    this.Children = ko.observableArray(); 
    this.Level = ko.observable(0); 

    // computed 
    this.Padding = ko.computed(function() { 
     return this.Level().ToString() + "px"; 
    }); 

    var mapping = { 
     'Children': { 
      create: function (args) { 
       return new FilterClause(args.data, this); 
      } 
     }, 
     'ignore': ["Parent"] 
    }; 

    ko.mapping.fromJS(json, mapping, this); 
} 

http://jsfiddle.net/bajGm/

답변

2

:

여기 내 코드입니다. 오류 수정에는 두 가지 방법이 있습니다. 먼저 계산에 두 번째 매개 변수로이를 추가하는 것입니다

this.Padding = ko.computed(function() { 
    return this.Level().ToString() + "px"; 
}, this); 

근무 바이올린 : http://jsfiddle.net/bajGm/1/

또는 초 - 변수에이를 할당합니다

var self = this; 
self.FilterClauseID = ko.observable(); 
self.Type = ko.observable(); 
self.Left = ko.observable(); 
self.Right = ko.observable(); 
self.ParentID = ko.observable(); 
self.Parent = ko.observable(parent); 
self.Children = ko.observableArray(); 
self.Level = ko.observable(0); 

// computed 
self.Padding = ko.computed(function() { 
    return self.Level().toString() + "px"; 
}) 

근무 바이올린 : http://jsfiddle.net/bajGm/3/

읽기 신중하게이 기사 http://knockoutjs.com/documentation/computedObservables.html. 문제의 근본 원인을 자세히 설명합니다.

+0

달콤한! 나는 지금 그 문제를 안다. 고맙습니다. 문서를 완전히 읽지 못해서 내 잘못입니다. 그래서 숙련 된 knockout/javascript 프로그래머가 두 가지 예제 중 어느 것이 더 낫습니까? 예를 들어 'one'은 훨씬 깔끔하게 보입니다. 그러나 'two'의 예는 더 명확하지만 실수를 저지르기 쉽습니다. 개인적인 선택일까요? – DIGGIDY

+0

또 다른 질문 @Artem Vyshniakov, 그것이 건설 상태에있는 경우 부모로부터 'Level'값을 어떻게 얻을 수 있습니까? – DIGGIDY

+0

나는 두 번째 방법을 선호한다. 죄송합니다. 질문하지 않았습니다. –

1

계산 된 패딩에서 이것은 창을 나타냅니다.

은 자기 개인 필드를 작성해야이 문제를 방지하려면 :

var self = this; 
self.FilterClauseID = ko.observable(); 
self.Type = ko.observable(); 
self.Left = ko.observable(); 
self.Right = ko.observable(); 
self.ParentID = ko.observable(); 
self.Parent = ko.observable(parent); 
self.Children = ko.observableArray(); 
self.Level = ko.observable(0); 

// computed 
this.Padding = ko.computed(function() { 
    return self.Level().toString() + "px"; 
}); 

See fiddle

+0

고마워요, 지금은 제대로 읽었습니다. – DIGGIDY