2013-11-28 99 views
1

如何在訂閱期間檢查這是更新還是初始化?淘汰賽訂閱:init或更新?

我有一個用戶可以節省數據庫的價值。加載值時,我不需要這樣做。我需要它們只在可觀察值更新時才加載?

這是我的我的數據加載到模型:

ko.mapping.fromJS(dataJson, {}, PortfolioView); 
    ko.applyBindings(PortfolioView, document.getElementById(containerId)); 

這就是我要做的用戶:

self.CompanyName = ko.observable(); 
    this.CompanyName.subscribe(function() { 
     // This won't get called on init 
     console.log("updated"); 
    }, this); 

當頁面加載我看到更新。

但是,實際上我有大約20個變量。

回答

1

你將不得不做任何事情。標準.subscribe函數不會在init中被觸發。

試試吧。 Jsfiddle

function vm() { 
    this.a = ko.observable("a"); 
    this.a.subscribe(function() { 
     // This won't get called on init 
     console.log("updated"); 
    }, this); 
} 

ko.applyBindings(new vm()); 

其實,我在演示中小提琴的結合是value。如果您正在討論自定義綁定,您會在specs中看到initupdate函數是分開的。


如果我們談論計算可觀,據我所知,檢查的唯一途徑,如果它是init的跟蹤第一次調用與一個獨立的變量。這種方法很糟糕:如果這是你需要做的,你可能做錯了什麼。從上面的例子中,我們繼續:

this._isInit = true; 
this.b = ko.computed(function() { 
    console.log("is init? " + this._isInit); 
    if (this._isInit) this._isInit = false; 
    return this.a(); 
}, this); 

Fiddle


由於您使用相關代碼更新了您的問題,我可以加深我的答案。從specs.fromJS的:

[fromJs]自動爲每個數據的屬性 可觀察特性。

這不是你要做的。你已經已經有你的可觀察和訂閱它:調用.fromJS將改變它的價值,導致訂閱觸發。讓PortfolioView接受dataJson作爲參數傳遞給它的構造函數,然後重寫你這樣的代碼:

function PortfolioView(data) { 
    this.CompanyName = ko.observable(data.CompanyName); 
    this.CompanyName.subscribe(function() { 
     // This won't get called on init 
     console.log("updated"); 
    }, this); 
} 

然後調用下面的代碼不會讓頁面加載認購火災。

ko.applyBindings(new PortfolioView(dataJson), document.getElementById(containerId)); 
+0

也許我不明白什麼是init和什麼是更新。因爲當我加載頁面並加載數據時,用戶被調用。 – renathy

+0

我首先使用ko.mapping.fromJs將數據加載到模型中,然後執行ko.applyBindings(AView,document.getElementById(containerId));在綁定期間,我在控制檯中進行了「更新」。 – renathy

+0

你能顯示一些代碼嗎?很可能,您正在創建一個空的可觀察對象,訂閱並加載數據。數據必須在您創建觀察值時加載。 ko.observable(yourData); (如果你不想/不能這樣做,那麼你將不得不創建一個臨時變量來監視是否是初始化或更新,但這不是必需的) – Saturnix