2013-12-11 49 views
0

我不確定,如果我正確地問這個問題,所以我嘗試解釋場景。我有這種感覺,我錯過了處理淘汰賽的簡單事情。如何在設計時處理未知屬性knockSJ

我讀取(以後寫入)多個xml文件。這些文件有一些項目是平等的,不同的某些條目:

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

讀取XML文件,我拿出其作爲沒有任何問題在大多數教程中提到,我可以訪問observableArray後。

因此,在這個例子中,我沒有任何問題,閱讀和編​​輯的「ID」,因爲我知道,這所謂的「ID」:

<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

可能重複(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); 
} 
}; 
[動態地從ko.observableArray集表格列]的
0

可以結構轉換未知數據爲已知視圖模型結構

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

http://jsfiddle.net/AKzLM/

+0

謝謝你的回答。我最近在聽一個研討會[鏈接:Knockmeout](http://vimeo.com/73627803),其中R.Niemeyer經常提醒這樣更新ViewModel,所以我很高興Tanner的想法!雖然ty :) – Atomic

+0

你是什麼意思更新視圖模型經常? – Anders

+0

在仔細觀察給出的例子之後,我不得不說抱歉。提出的解決方案是好的:)。 Tanner提出的解決方案更符合我的需求。 – Atomic