2014-09-22 40 views
0

我想找到避免在啓動頁面時觸發可觀察訂閱的最佳做法。如何避免訂閱觸發數據綁定下拉菜單的初始化?

問題:

當你有像下面描述的來說,警報會在啓動時顯示,這是不必要的:

foo.someProperty = ko.observable(null); 
foo.someProperty.subscribe(function() { alert(foo.someProperty()); }); 

難以忽視的解決方案:

到現在爲止,我一直在使用以下解決方案:

foo.someProperty.subscribe(function() { 
    if (TriggersEnabled()) { alert(foo.someProperty()) }; 
}); 

TriggersEnabled檢查避免回調執行,但此解決方案要求創建TriggersEnabled屬性。此外,它必須在啓動前設置爲false,在完成頁面加載後設置爲true。

問題

我能避免這種情況?有沒有其他方法可以達到同樣的效果?

+1

@TPaim,可以在創建(或更新)一個的jsfiddle這說明您的問題?如果observable在創建時被設置(如@Joroen所示),那麼'subscribe'不會提前觸發。 – 2014-09-22 23:33:28

+0

嘿@Jeroen和@Matt!當屬性綁定到select時會發生問題。檢查這個小提琴:http://jsfiddle.net/a0v9y30r/ – TPaim 2014-09-23 03:11:01

回答

1

根據您提供的小提琴事件觸發,因爲您綁定到select元素的默認值不是列表中的值。所以當選擇列表顯示時,它改變了它綁定到第一個選項的可觀察值的值。

解決此問題的一種方法是確保您綁定到select元素的observable的默認值是有效值。

例子:

var page = new PageVM(); 
 

 
function PageVM() { 
 
    
 
    var vm = this; 
 
    
 
    vm.someProperty = ko.observable(''); //Provide a default value that will be in the select list 
 
    
 
    vm.someProperty.subscribe(function() { alert(vm.someProperty()); }); 
 
}; 
 

 
ko.applyBindings(page);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
foo.someProperty 
 
<select data-bind="value: someProperty"> 
 
    <!-- make sure the first option matches the default value of someProperty --> 
 
    <option value="">Select...</option> 
 
    <option value="01">Option 01</option> 
 
    <option value="02">Option 02</option> 
 
</select>