2016-04-20 44 views
0

我將盡我所能解釋這一點。我在這個對象中有一個名爲BaseForm的對象,我有函數和knockout observables。我有一個叫做Initialize的函數,裏面有一個對象,裏面充滿了ko可觀察對象。其中一個觀察對象稱爲FormVisible並初始化爲true(FormVisible: ko.observable(true))。我也有一個叫做OnClickRow的功能。在此功能中,它將FormVisible從true更改爲false。我實例化BaseForm多次。當我打電話給OnClickRow時,它隻影響實例化的最後一個對象。爲什麼會發生?我該如何解決它?在一個物體內擊倒觀察對象

這裏是我的代碼:

function BaseForm() { 
    var that = this; 
    BaseForm.prototype.Initialize = function(model) { 
    this.model = model; 
    this.FormVM = { 
     FormVisible: ko.observable(true) 
    } 
    } 

    BaseForm.prototype.OnClickRow = function() { 
    that.FormVM.FormVisible(false); 
    } 
} 

this.base1 = new BaseForm(); 
this.base1.Initialize("new"); 

this.base2 = new BaseForm(); 
this.base2.Initialize("old"); 

this.base3 = new BaseForm(); 
this.base3.Initialize("other"); 

this.base1.OnClickRow(); 

這裏是jsfiddle

+0

你會發現這是很有幫助的http://jsfiddle.net/GSvnh/5147/ –

回答

0

我其實已經想通了。這是一個非常簡單的修復。我將this.FormVM更改爲that.FormVM,並將其更改爲OnClickRow我將that.FormVM.FormVisible(false);更改爲this.FormVM.FormVisible(false)。我仍然不確定爲什麼這種方式可行,爲什麼另一方不行。所以如果有人有解釋,那會很棒。謝謝!

這是更新的fiddle

0

你需要移動的構造之外的原型配置,變「說」到「這個」:

function BaseForm() { 
    var that = this; 
} 

BaseForm.prototype.Initialize = function(model) { 
    this.model = model; 
    this.FormVM = { 
     FormVisible: ko.observable(true) 
    } 
} 

BaseForm.prototype.OnClickRow = function() { 
    this.FormVM.FormVisible(false); 
} 
  1. 原型繼承鏈上稱爲「新」或的Object.create ()。因此,您不應該在構造函數中聲明原型方法,因爲不能保證原型鏈尚未初始化。

  2. 將這些方法移到構造方法之外意味着'那個'將是未定義的,並且使用'this'因此引用期望的對象。

我會建議您閱讀Mozilla Javascript文檔以增強您對自定義對象的瞭解。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript#Custom_objects