2013-03-28 47 views
2

我爲自己的應用程序使用了我自己的簡單模板系統,並且每頁都將加載未知數量的「相同」模板。使用動態名稱創建KnockoutJS可觀察項目

所以基本上,我通過ajax調用獲取一些數據並獲得uniqueId。然後,我將模板加載到我的頁面中,並使用uniqueId應用ids和data-bind =「with:」。

<div id="content-uniqueId"> 
    <div data-bind="with: uniqueId"> 
     ... 
    </div> 
</div> 

然後我調用一個函數,並試圖使用uniqueId創建一個observableArray,以便它綁定到我的'with'。

喜歡的東西:

function(uniqueId) { 
    var theObservable = uniqueId; 
    theObservable = ko.observableArray(); // make the observable name equal to uniqueId 
    // get some data 
    theObservable(new data); 
} 

我創建了一個JS小提琴,以幫助明確的事情了,但它不會工作,因爲我沒有收到阿賈克斯數據或者通過一個唯一的ID。

JS Fiddle here

編輯:

Updated JS Fiddle,每下面Tyrsius'建議。

this[uniqueId] = ko.observableArray(new entityApp.dataContext.EntityModel(data)); 

絕對一步接近,但我得到了一個錯誤:

傳遞的參數初始化數組觀察到時,必須是一個數組,或者爲null或undefined

但'新的entityApp.dataContext.EntityModel(data)'返回一個對象數組,所以它應該沒問題。

回答

2

的Javascript使得動態分配和反射簡單與其目的索引:

var ViewModel = function(propName) { 
    this[propName] = ko.observable("reflection"); 
}; 

ko.applyBindings(new ViewModel("dynamic")); 

這裏是a fiddle展示的結合。

+0

謝謝,我現在更近了一步。但是我仍然收到錯誤信息(請參閱上面的編輯)。更新你的JS小提琴,使它更貼近我的情況。我不明白爲什麼它不起作用,但我可能仍然在做一些愚蠢的事情。 http://jsfiddle.net/FHz4k/3/ – dmathisen

+0

你的問題是'theArray'是一個對象,而不是一個數組。你想要'theArray.names',或者'ko.observableArray([theArray])'? – Tyrsius

+0

嗯。我不知道。當我不使用這些動態uniqueIds時,使用該數據可以很好地執行var obs = ko.observableArray();然後obs(new entityApp.dataContext.EntityModel(data));我不知道。我很感激幫助。我可能不得不重新考慮我的方法。 – dmathisen