2012-09-11 31 views
4

我試圖用Ember.js和Handlebar.js共築表中的每個循環。不幸的是我遇到了如何構建由Ember.TextArea和valueBinding組成的單元格的方法。如何實現嵌套定製傭工(車把)

這個想法如下。有一個領域模型項目有很多條目(1到n關係)。兩個域模型都是不同的對象,並且不嵌入(條目未嵌入項目中)。

每個項目都有稱爲鍵的陣列,其包含多個字符串(例如 'A', 'B', 'C',...)。此外每個條目都包含一組元素。每個這個元素也有一個上面提到的鍵作爲屬性鍵。請參閱下面的詳細模型。

模型

項目

{ keys: ['a', 'b', 'c'] } 

條目

{ 
    parameters: [ 
    { 
     key: 'a', 
     value: 'aaaa' 
    }, 
    { 
     key: 'b', 
     value: null 
    }, 
    { 
     key: 'c', 
     value: '123' 
    } 
    ] 
} 

的目標是在最終具有其中包含的每個鍵的列的HTML表該項目(在上述案例中將會有3個標題爲'a','b','c'的列)。對於現在與項目關聯的每個條目(換句話說,在後臺加載到ArrayController中),必須有一行。現在來了棘手的部分:每個單元格必須綁定到「參數」數組的適當元素(單元格的內容應該是Ember.TextArea)。

|| a                || b || c || 
----------------------------------------------------------------------------- 
| entry 1 binding to element of parameters array where key = 'a' | ... | ... | 
---------------------------------------------------------------------------- 
| entry 2 binding to element of parameters array where key = 'a' | ... | ... | 
----------------------------------------------------------------------------- 

方法我

構建表頭明顯,當然很容易和工作沒有任何問題:

<table> 
    <thead> 
    <tr> 
     {{#each key in project.keys}} 
     <th>{{key}}</th> 
     {{/each}} 
    </tr> 
    </thead> 

    <tbody> 
    ... 
    <tbody> 
</table> 

,我不知道如何構建的一部分代碼是正文。遍歷數組控制器中的條目可能是的,但如何綁定到適當的元素 - 我不知道。棘手的是,綁定是建立在正確的元素上的。例如,在鍵'a'的列中,綁定必須是參數數組的元素,其中element.key ==='a'。

<tbody> 
    {{#each entry in App.entriesController}} 
    <tr> 
     {{#each key in project.keys}} 
     ??? 
     {{/each}} 
    </tr> 
    {{/each}} 
</tbody> 

我想用一個車把幫手但計算出,Ember.js確實(比handlebar.js的文檔不同)未通過對象本身,它只傳遞屬性其中之一的名稱然後可以用來獲取價值。不幸的是,對於一個數組,我看不出如何獲取當前在每個循環中處理的數組的條目。

這個想法是將條目和關鍵字傳遞給helper,然後這個返回一個綁定到entry.parameters數組的正確元素的Ember.TextArea的實例。

注:通過循環project.keys我們可以保證按鍵的順序是一樣的,在報頭(相同的迭代順序)。

任何其他的想法如何處理這個問題?

+0

沒有人知道如何解決這個問題嗎?或者讓我反過來問一下。我可以通過代碼來創建一個EmberView嗎?如果是的話,有人可以分享一個簡短代碼示例,瞭解如何通過代碼創建視圖(例如添加子視圖...)。 – rit

回答

1

瘋狂浴缸的想法:你可以使用灰燼。對象作爲代理服務器,就可以動態地定義線性特性(在CoffeeScript中的理智,剛剛從題庫名):

TheProxy = Ember.Object.extend 
     fill: (projects, entries) -> 
     for project in projects 
      entry = # find entry for project 
      for key,value of entry 
      this.set "value_for_#{project.id}_#{key}", value 

之後,你可能會產生類似的方式模板,通過生成{{value_for_xxx_yyyy} }將TheProxy的已填充實例綁定並綁定到它。

+0

如何將視圖綁定到此(因爲屬性是動態生成的?) {{#view Ember.TextField valueBinding =「?」}} – rit

+0

Ok,所以我現在用函數 - >覆蓋了模板屬性,函數(上下文,選項){...}在其中我生成字符串'{{查看Ember.TextArea valueBinding =「value_for_123_en」}}'。我現在需要從這裏回來什麼? HTML?如果是的話,我如何從上面的字符串中獲取HTML? – rit

+0

好吧,它的工作原理:D我會在後面粘貼答案代碼 – rit

4

這裏最好的解決方案是編寫一個自定義的手柄幫手。不幸的是,現在製作自定義綁定助手並不容易。這裏有一箇舊公關,我們想要更新並獲得1.0 https://github.com/emberjs/ember.js/pull/615的工作。你也許可以從中得到一些想法來做你自己的實現。

+0

感謝您的鏈接。將看看它,但不幸的是,我是JavaScript和Ember.js的新手,所以不知道如果我會弄清楚這是如何工作的:) – rit