2013-03-28 5 views
2

Я использую свою собственную систему простого шаблонирования для своего приложения и загружаю неизвестное количество «одинаковых» шаблонов на страницу.Создание нокаута JS с динамическим именем

Так что, в основном, я получаю данные через вызов ajax и получаю uniqueId. Затем я загружаю шаблон в свою страницу и применяю идентификаторы и data-bind = "with:", используя uniqueId.

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

Тогда я вызываю функцию, и я пытаюсь создать observableArray с помощью UniqueID, так что он связывается с моим «с».

Что-то вроде:

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

Я создал JS скрипку, чтобы помочь очистить вещи, но это не будет работать, потому что я не получаю АЯКС данные или передавая уникальный идентификатор.

JS Fiddle here

EDIT:

Updated JS Fiddle, согласно предложению Tyrsius' ниже.

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

Определенно один шаг близко, но я получаю сообщение об ошибке:

аргумент, передаваемый при инициализации наблюдаемый массив должен быть массив, или нуль, или неопределенными

Но ' new 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

Хммм. Я не знаю. Когда я не использовал эти динамические уникальные идентификаторы, использование этих данных отлично работало с var obs = ko.observableArray(); затем obs (new entityApp.dataContext.EntityModel (данные)); Я не знаю. Я ценю помощь. Возможно, мне придется пересмотреть мой подход. – dmathisen

Смежные вопросы