2012-03-02 154 views
2

我想知道如果我要下去了使用MVVM模式和淘汰賽JS這樣做的正確的路線,這是我目前的情況:淘汰賽JS建議

ASCX: 
<asp:TextBox runat="server" ID="TextboxDescription" Width="300" ClientIDMode="Static" /> 

JS: 
$('#TextboxDescription').limitCharacters({ 
       limit: 1000, 
       alertClass: 'error', 
       id_result: 'description_limit', 
       align: 'right' 
}); 

所以你看,我有依靠文本框始終被稱爲「TextboxDescription」,這是我認爲 MVVM進來我會改變我的代碼看起來是這樣的:

ASCX: 
<asp:TextBox runat="server" ID="TextboxDescription" Width="300" ClientIDMode="Static" data-bind="{ not even sure what goes here, no Knockout load event? }" /> 

JS: 
function ViewModel() { 
    setLimit = function(limit, alert, id, align) { 
      // code here to call limitCharacters on sender(?!) 
    } 
}; 

ko.applyBindings(new ViewModel()); 

我一直在閱讀有關自定義綁定在淘汰賽中,這是我必須要走的一條路線爲了與我自己的小部件綁定,下去?

回答

2

你是在正確的軌道上。這是一個基本的示例自定義綁定,應該做你想做的事(未經測試)。

ko.bindingHandlers.limitCharacters = { 
    init: function(element, valueAccessor) { 
     // this gets called at the start when the element is first bound 
     // use it to bind event handlers widgets etc 
     var $element = $(element), 
      limit = ko.utils.unwrapObservable(valueAccessor()); // this gets the value of the object on the rhs of the binding 

     $element.limitCharacters({ 
       limit: limit, 
       alertClass: 'error', 
       id_result: 'description_limit', 
       align: 'right' 
     }); 
    } 
} 

你現在結合會是什麼樣子

<asp:TextBox runat="server" ID="TextboxDescription" Width="300" ClientIDMode="Static" data-bind="limitCharacters: 1000" /> 

目前的限制可能是可觀察的,而不是簡單地1000(注意unwrapObservable調用)。如果您希望綁定對可觀察值更改中的值作出反應,那麼您可以將更新函數添加到將綁定到的可觀察值發生更改時調用的綁定。在這裏,您可以重新初始化您的插件或調整它的設置。

希望這有助於

+0

驚人的答案,謝謝你了 - 真的要幫我一起在我的基因敲除實現:) – 2012-03-03 10:43:27

+0

沒問題。 Knockout祝你好運,這真的改變了我寫JavaScript的方式。 – madcapnmckay 2012-03-03 15:54:20

+0

我可以看到它也一樣!還有一件事,如果你有時間,你如何通過2個變量來傳遞?與示例相同,只需通過json樣式數組?像{limit:1000,alertClass:'alert'}? – 2012-03-04 10:35:37