2016-03-23 68 views
0

我有一個這樣的字符串:如何使用knockoutjs從字符串生成表單和文本?

var par = 'hello my name is @firstname.'

與淘汰賽JS我想產生這個字符串的形式和文字,可能是這樣的:

<input type="text" data-bind="value:firstname" /> 

<p> 
hello my name is <span data-bind="text:firstname"></span>. 
</p> 

所以@firstname將產生以名字firstname輸入,並且firstname上的每個更新都會更新段落。

我創建的jsfiddle測試: https://jsfiddle.net/yozawiratama/rmsuc5uv/

但還是不行的,因爲還是硬編碼 感謝

+0

在您的viewmodel中,您沒有使用** firstname **,那麼您正在嘗試做什麼? – xxxmatko

+1

爲什麼還要用正則表達式來打擾?這是https://jsfiddle.net/rmsuc5uv/5/你想完成什麼? – xxxmatko

+0

正則表達式在'你好,我的名字是[at] firstname'中的名字[at]名字中。一個帶有符號[at] – yozawiratama

回答

2

這實際上是一個非常有趣的問題,你已經得到了它幾乎解決。唯一的是,你改變par,所以在第一次替換後,它不再包含你的變量。相反,在計算中的原件的副本上工作,然後返回該副本。

var par = 'hello my name is @firstname.' 
 
var pattern = /\[email protected][a-z0-9_-]+/gi; 
 
var ViewModel = function() { 
 
    var self = this; 
 
    self.firstname = ko.observable("yoza"); 
 
    self.defaultParagraph = ko.observable(par); 
 
    self.paragraph = ko.computed(function() { 
 
    var p = self.defaultParagraph().match(pattern); //to get @firstname 
 
    var newPar = par; 
 
    for (var ii = 0; ii < p.length; ii++) { 
 
     var re = new RegExp(p[ii], 'g'), 
 
      replacement = self[p[ii].replace('@', '')](); 
 

 
     newPar = newPar.replace(re, replacement); 
 
    } 
 
    return newPar; 
 
    }); 
 
} 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<input type="text" data-bind="value:firstname" /> 
 

 
<p data-bind="text:paragraph"> 
 
</p>

對於一個更一般的情況下,如果你不知道在你的變量可能會是,你要結合空對象自定義綁定處理程序。 init部分將在該對象內創建可觀察對象並創建DOM元素,並調用綁定。 update部分將與您的computed類似。

+0

非常感謝你,我真的在等你這樣的人。 – yozawiratama