2013-12-11 4 views
0

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

Я прочитал (и позже напишу) несколько файлов xml. Эти файлы имеют некоторые элементы, которые равны и некоторые записи, которая отличается:

<elements> 
    <id>123</id> 
    <unknown>some text</unknown> 
</elements> 

После чтения XML-файлов, которые я пришел с observableArray, который я могу получить доступ, как указано в большинстве учебных пособий без каких-либо проблем.

Таким образом, в этом примере у меня нет никаких проблем, чтобы прочитать и отредактировать «идентификатор», потому что я знаю, что он называет «идентификатор»:

<span data-bind="text: $data.id"></span> 

Но есть записи в XML, что я не знаю, но они находятся в observableArray и я могу «увидеть», что, если я имею в виду $ данные:

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre> 

Это показывает мне неизвестные части:

... 
{ 
    "unknown": "some text" 
} 
... 

Чтобы изменить это свойство, мне приходилось обращаться к ним по имени или есть другой вариант? Так что моя проблема в том, чтобы получить доступ к этому, например, с помощью:

<input data-bind="value: $data.???" /> 

Если требуется больше информации, пожалуйста, дайте мне знать.

Спасибо за идеи и ответы.

+0

возможно дубликат [столбцов таблицы задается динамически из ko.observableArray] (http://stackoverflow.com/questions/17446548/set-table-columns-dynamically-from-ko-observablearray) – Tanner

+0

@Tanner Многие спасибо, что разделил этот пост, которого я не нашел!Я создам ответ, где я использую эту идею для решения моей проблемы. TY! – Atomic

ответ

0

HTML,-разметки:

<div data-bind="foreach: $data.elemente"> 
    <pre data-bind="text: ko.toJSON($data)"></pre> 
    <ul data-bind="foreach: $root.element"> 
    <div data-bind="if: $parent[$data]" > 
     <label data-bind="text: $data"></label> 
     <input data-bind="value: $parent[$data]" /> 
    </div> 
    </ul> 
</div> 

Javascript Код:

// this is for "click: selected" 
    this.selected = ko.observableArray(); 

    this.element = ko.computed(function() { 
     if (self.selected().length === 0) { 
     return []; 
     } 
     var bez = []; 
     var obj = self.selected().elemente; 
     console.log(obj); 
     for (var n in obj) { 
     for (var i in obj[n]) { 
      bez.push(i); 
     } 
     } 
     return bez; 
    }); 

JSONObject, который будет соответствовать (вид хром):

0: Object 
    elemente: Array[3] 
    0: Object 
     meinfeld: "feldBalue1" 
     __proto__: Object 
    1: Object 
     feldxyz: "xyzValue" 
     __proto__: Object 
    2: Object 
     feld123: "Top 123" 
    __proto__: Object 

и результат в браузере:

the result in the browser

редактирования: Приятным способом является использование настраиваемого обработчика привязки:

ko.bindingHandlers.readXml = { 
    init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
    console.log(allBindings()); 
    var xmlElements = getValueAccessor(valueAccessor()); 
    ko.bindingHandlers.foreach.init(element, xmlElements, allBindings, viewModel, bindingContext); 
    return { 
    controlsDescendantBindings: true 
    }; 
}, 
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
    var xmlElements = getValueAccessor(valueAccessor()); 
    ko.bindingHandlers.foreach.update(element, xmlElements, allBindings, viewModel, bindingContext); 
} 
}; 
0

Вы можете преобразовать Неизвестная ДАННЫЕ структуру известного ViewModel структуры

Как

for(var name in data) { 
    this.values.push(new ValueViewModel(name, data[name])); 
} 

http://jsfiddle.net/AKzLM/

+0

Спасибо за ваш ответ. Недавно я слушаю семинар [link: Knockmeout] (http://vimeo.com/73627803), где Р.Ниемейер предупреждает об обновлении ViewModel так часто, поэтому я доволен идеей от Tanner! Хотя ty :) – Atomic

+0

Как часто вы просматриваете модель просмотра? – Anders

+0

Подойдя ближе к данному примеру, я должен извиниться. Представленное решение прекрасное :). Решение, которое предлагает Tanner, больше соответствует моим потребностям. – Atomic

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