2013-03-29 47 views
1

我是KnockoutJS的新手。我知道如何定義將用於更改元素文本(或從文本元素更新)的observable,但是,我希望模型中的數據實際上是一個具有讀/寫訪問權限的正則表達式。我想用一個textarea喜歡設置:在knockoutjs中綁定正則表達式作爲可觀察對象

<textarea data-bind="value: regex"></textarea> 

而使用顯示在頁面上:

<span data-bind="text: regex"></span> 

現在初始化工作:

//inside the model 
this.regex = ko.observable(/,/g); 

而且兩者的textareaspan得到更新(因爲本地正則表達式變量有一個toString()函數,它可以非常好地顯示字符串表示形式的正則表達式)。但是當我更改textarea中的regex時,span不會更新。這似乎是設置可觀察的是失敗的。

這是可以理解的,因爲textarea中的value只是一個文本,爲了將其轉換爲實際的正則表達式,需要一些代碼。我有代碼。讓我們把它與function str2regex()類似這樣的身體:

//this is pseudo code and doesn't neccesarily work 
function str2regex(str) 
    var r = str.match("^\/(.+?)\/([mig])*$"); 
    if (r) { 
    if (r[2] === null) { 
     return new RegExp(r[1]); 
    } else { 
     return new RegExp(r[1], r[2]); 
    } 
    } 
    return null; 
} 

我怎樣才能設置類型的正則表達式的在我的模型使用從textarea來的文本價值?

回答

2

你應該改變你str2regex來計算觀察到的是這樣的:

// str2regex transformed to computed observable 
self.regex = ko.computed(function(){ 
    var m = self.regex_string().match(/^\/(.+)\/([mig])*$/); 
    return m ? new RegExp(m[1], m[2]) : null; 
}); 

但你還是應該跟蹤你的正則表達式的字符串textarea的編輯(regex_string觀察到在我的代碼)。

請看:http://jsbin.com/ofehuj/2/edit

+0

是啊,這就是我所做的最後。如果我可以使用textarea直接設置正則表達式而不在模型中定義新變量,那將會很好。但無論如何,我猜這是有效的。 – AlexStack

相關問題