你將不得不做任何事情。標準.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中看到init
和update
函數是分開的。
如果我們談論計算可觀,據我所知,檢查的唯一途徑,如果它是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));
也許我不明白什麼是init和什麼是更新。因爲當我加載頁面並加載數據時,用戶被調用。 – renathy
我首先使用ko.mapping.fromJs將數據加載到模型中,然後執行ko.applyBindings(AView,document.getElementById(containerId));在綁定期間,我在控制檯中進行了「更新」。 – renathy
你能顯示一些代碼嗎?很可能,您正在創建一個空的可觀察對象,訂閱並加載數據。數據必須在您創建觀察值時加載。 ko.observable(yourData); (如果你不想/不能這樣做,那麼你將不得不創建一個臨時變量來監視是否是初始化或更新,但這不是必需的) – Saturnix