2014-09-03 58 views
1

我想在knockout.js自定義綁定中使用變量。特別是在init回調中的事件處理程序中。在自定義綁定處理程序中使用非可觀察對象

實施例:

ko.bindingHandlers.test = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     var $element = $(element); 
     var f = valueAccessor(); 

     $element.mousedown(function(e) { 
      f = true; 
     }); 
    }, 
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     var f = valueAccessor(); 
    } 
}; 

型號:

var ViewModel = function() { 
    this.flag = false; 
}; 

這裏是fiddle

問題是:如果在元素上觸發mousedown,則flag未在模型中更新。

問題是這樣的線:

var f = valueAccessor(); 

值被複制,而不是參考。布爾人是原始人。

我可以讓flag可觀察,所以它是一個函數,我有處理程序內的引用。但我不想要一個可觀察的......我只是不需要'在這裏通知監聽者'的變化。

我也可以做一個包裝函數或其他...但是...一個函數只是爲了得到布爾的引用?

我需要此功能只是爲了報告綁定的「狀態」。外部功能有時需要這些信息,但他們不希望在值發生變化時被淘汰。

是否有最佳做法或什麼?

回答

1

關於

我只是不需要「通知就到這裏

change'特徵聽衆認爲,如果這是一個足夠強大的理由不使用可觀察到的。有沒有的實際缺點如果你使用可觀察的 - 或的實際優勢如果你不這樣做?

淘汰賽充滿了觀察對象和其他更復雜的事情。如果你「保存」了一個可觀測值,你並沒有真正獲得任何東西。畢竟,在他們提供好處的地方使用它們,這就是框架的用途。

如果你沒有一個observable的訂閱者,只是爲了方便使用它來保持某種內部狀態 - 這是使用observable的完美理由。

如果你絕對,肯定必須避免觀察到的,你可以通過一個視圖模型屬性的名稱:

ko.bindingHandlers.test = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     var propertyName = valueAccessor(); 

     $(element).mousedown(function(e) { 
      viewModel[propertyName] = true; 
     }).mouseup(function(e) { 
      viewModel[propertyName] = false; 
     }); 
    } 
}; 

<input type="text" data-bind="test: 'flag'"> 
+0

這是一個表現的原因。我打算經常使用這個綁定的veeeeeeeery,並且knockout正在調用每個使用observable的函數。無論如何...你的解決方案喜歡不錯,我會嘗試;) – user3796786 2014-09-03 10:58:47

+0

出於好奇:你可以提供一個關於jsFiddle骨架的例子,當你使用可觀察性的時候遇到性能問題嗎? – Tomalak 2014-09-03 11:02:15

+0

是的,我可以準備一個,但是:你的解決方案的核心信息是:「不要使用原語,因爲你需要參考」。在這種情況下,可觀察物不是任何類型的wrapperobject/wrapperfunction。我不想要任何類型的包裝...只是寫一個布爾值。這只是感覺不正確。可觀察的是最重的包裝類型,因爲它具有通知事情。使用包裝器會降低性能。 – user3796786 2014-09-03 11:12:28

相關問題