2016-02-24 83 views
0

我正在進行我的第一個自定義綁定。我希望能夠根據資源文件指定出現在元素上的文本。像這樣:使用自定義綁定更新元素文本

var exampleResource = { 
    hello: 'world' 
}; 

ko.bindingHandlers.resource = { 

    init: function (element, valueAccessor) { 

     var value = valueAccessor(); 

     ko.bindingHandlers.text.update(element, function() { 
      return exampleResource[value] || ''; 
     }); 
    } 

}; 

<span data-bind="resource: 'hello'"></span> 

我應該如上所述使用ko.bindingHandlers.text嗎?

由於資源變量不可觀察,有沒有爲綁定添加update回調的任何一點?如果我正確理解它,只有當一個可觀察值被傳遞爲值時纔會被調用?

回答

1

如果您想支持綁定處理程序的輸入是動態的,那麼您需要一個update。在你的例子中,你不這樣做,但你可能。這裏有一個例子:

var exampleResource = { 
 
    hello: 'world', 
 
    goodbye: 'drowl' 
 
}; 
 

 
ko.bindingHandlers.resource = { 
 
    update: function (element, valueAccessor) { 
 
     var key = ko.utils.unwrapObservable(valueAccessor()); 
 
     ko.bindingHandlers.text.update(element, function() { 
 
      return exampleResource[key] || key; 
 
     }); 
 
    } 
 
}; 
 

 
ko.applyBindings({ myObs: ko.observable('goodbye') });
span { font-weight: bold; color: red; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script> 
 

 
Static: <span data-bind="resource: 'hello'"></span> 
 
<hr> 
 
Dynamic: <span data-bind="resource: myObs"></span> 
 
- based on: <select data-bind="value: myObs, options: ['hello', 'goodbye']"></select>

如果您不需要這個動態性,你可以堅持你的舊解決方案。但是,在那種情況下,我會質疑KnockoutJS對資源的附加價值:-)

+0

謝謝。我的另一個想法是在我的視圖模型中添加一個獲取資源數據的方法,但是在它們之間添加它並不感覺幹。在這種情況下,我想我可以繼承原型繼承。你有沒有看到其他解決方案? – filur

+0

如果我正在開發一個ASP.NET應用程序或類似的東西,我會使用現有的資源處理。但是這是一個只包含javascript的單頁應用程序,所以我的計劃是讓淘汰賽處理它。我想這只是一個如何將靜態數據映射到用戶界面的問題... – filur

+0

似乎像https://github.com/tfsjohan/Knockout-Localization-Binding/blob/master/src/ko.localizationbinding .js在同一軌道上,對嗎? :) – filur

相關問題