2016-07-12 33 views
1

有時候我們需要使用notifySubscribers來強制執行一個observable的子腳本,你可以傳遞一個param來通知subscriberSubscribers,但問題是這個通過的param既不會改變observable的值,也不會傳遞給subsriber ,那麼爲什麼它被使用?我在一些Knockout文檔中看到,例如,在this one中傳遞了一個參數。這是一個jsfiddle code snippet,它驗證了param在任何地方都沒有使用的事實。我錯過了什麼,或者這個參數確實沒有意義?Knockout,爲什麼我們需要notifySubscribers的參數?

守則的jsfiddle HTML

<div data-bind="text: $data.content"></div> 

的JavaScript

var viewModel = { 
    content: ko.observable('original') 
}; 

var cpted = ko.computed(function(){ 
    alert(viewModel.content()); 
    return viewModel.content(); 
}); 

ko.applyBindings(viewModel); 

viewModel.content.notifySubscribers('new value'); 

alert(viewModel.content()); 
+0

我很好奇,爲什麼你想要「強制執行訂戶」,當值沒有改變。如果價值沒有改變,他們在做什麼? – Tyrsius

+0

這個文檔中有一個例子http://knockoutjs.com/documentation/extenders.html,只是搜索notifySubscribers @Tyrsius –

回答

4

notifySubscribers調用所有已註冊爲給定事件的訂閱。默認情況下,訂閱是針對change事件進行的,但訂閱系統是爲支持多個事件而構建的。在內部,Knockout還會引發beforeChange的事件,您可以在源代碼here中看到該事件。

subscribe方法(看到here)的簽名是

subscribe: function (callback, callbackTarget, event)

如果你離開了最後的參數,change默認情況下使用。但是您可以訂閱beforeChange活動,甚至可以訂閱製作您自己的活動!這就是爲什麼notifySubscribers需要一個事件名稱。

你說你試圖「強制執行訂戶」,當值沒有改變。也許自定義事件比change事件更好,因爲即使值沒有改變,您仍在運行該事件。

+0

我沒有得到你的答案,這似乎與我無關。 @Tyrsius –

+0

@David我添加了一些細節,這有幫助嗎?如果沒有,請解釋你的困惑 – Tyrsius

+0

我認爲我有這個想法,我的代碼片段只包含計算,所以傳遞的valueToNotify不會在任何地方使用,但如果我調用viewModel.content.subscribe(aCallback),valueToNotify是第一個aCallback的參數。我認爲我基本上被依賴和訂閱之間的區別困惑,但這是一個不同的問題。 @Tyrsius –