2013-07-12 38 views
1

我有真正的問題,理解爲什麼這個簡單的測試會引發運行時錯誤。Knockout - JavaScript運行時錯誤:對象不支持屬性或方法'Level'

我有一個淘汰賽計算財產「級別」作爲我的FilterClause對象的一部分,我已經按照文檔來的信,但它仍然拋出運行時錯誤...

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

我認爲它與在聲明計算屬性函數的構造時未被實例化的對象有關。但是,它似乎遵循了,或者至少似乎遵循了信件的敲除文件。

困惑!

這裏是我的代碼:

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

甜!我現在看到了這個問題。非常感謝你。我的錯是沒有完全閱讀文檔。因此,從一個經驗豐富的淘汰賽/ JavaScript程序員,這兩個實例中的哪一個更可取?例如'one'看起來更整潔,但'two'例子更清晰,但可能更容易出現錯誤。我想個人選擇? – DIGGIDY

+0

另一個問題@Artem Vyshniakov,如果您還處於施工狀態,您將如何從父級獲得「級別」值? – 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

相關問題