2014-01-29 111 views
0

我正在構建一個管理組件,它構建了一個用於編輯給定模型屬性的小窗體。關鍵是它是模型獨立的,我幾乎在那裏(我認爲),但我一直在努力讓綁定正常工作。通過模型的屬性進行綁定迭代

這裏的設置...模板action.hbs提到了我的組件,並通過在modelMeta屬性(更多的在秒):

{{model-admin-form 
    model=content 
    meta=modelMeta 
}} 

在控制器(ActionController)我定義了modelMeta屬性爲:

modelMeta: function() { 
    var vals = []; 
    var attributeMap = this.get('content.constructor.attributes'); 
    var self = this; 
    attributeMap.forEach(function(name, value) { 
     item = Ember.Object.create({ 
      name: value.name, 
      type: value.type, 
      value: self.get('content.' + name) 
     }); 
     vals.push(item); 
    }); 
    return vals; 
}.property('content'), 

這使我模型中的所有屬性的陣列,並且對於每個它給我「名稱」,「類型」和「值」。除了「價值」沒有被綁定到模型之外,這很好。 OK,沒問題,我只是改變了分配行:

valueBinding: self.get('content.' + name); 

都能跟得上。這是行不通的。該死的。爲什麼不?那麼使用灰燼督察我可以看到,valueBinding是安裝程序,但它_from屬性似乎squiffy:

我會想到是指向像「controllers.actions.content ...」或有這樣的結果。相反,「Alt獲得」的值是屬性的實際字符串值,但不是綁定引用。

任何人都可以幫助我嗎?

= - = - = - = - = - = - = - UPDATE = - = - = - = - = - = - = -

我已經更新的例子稍微彌補更加清晰添加一點上下文。本練習的最終目標是提供一個計算屬性modelMeta,它是一個數組,其中數組中的每個元素表示模型中屬性的元信息。捕獲的元信息是:

  • name:屬性名
  • 類型:變量(例如,字符串,數字等)
  • 值/的ValueBinding的類型:綁定參考命名屬性在模型記錄上

前兩個是小菜一碟。最後一個是棘手的部分。獲得一個非綁定的值也是微不足道的,但綁定它似乎是棘手的。

回答

1

你可以嘗試:

var record = self.get('content'); // yes? 
... Object.create({ 
    valueBinding: 'record.' + name, 
    record: record // give the binding something to bind against 
}); 

這裏是什麼錯在你的代碼:

value: self.get('content.' + name)獲得屬性值太早,填充模型實例可能之前。如果模型屬性更改,它肯定不會更新。

valueBinding: self.get('content.' + name)不起作用,因爲它試圖建立綁定,無論屬性的。假設name'email',那麼self.get('content.' + name)可能是'[email protected]',因此value現在綁定到名爲'[email protected]'(始終未定義)的屬性。

+0

太棒了。像魅力一樣工作。謝謝Jo。 – ken

0
var metaObject = Ember.Object.extend({ 
    value: Ember.computed.alias('item.name') 
    //^same as saying valueBinding: 'item.name' 
}); 


// Then in your model 

modelMeta: function() { 
    var attributeMap = this.get('content.constructor.attributes'); 
    var self = this; 
    return attributeMap.map(function(name, value) { 
    metaObject.create({ 
     item: item 
    }) 
    }); 
}.property('content') 

不確定我是否包含了所有你想要的屬性,但是你有上述的想法。將項目傳遞到實例create()並將項目綁定定義到類定義中。

+0

我試過這個,但無濟於事。其實有種感覺就像退後一步,因爲我再也看不到Ember Inspector的綁定(不是我會在意它是否工作)。讓我爲上面的問題增加一點更多的上下文,使其更清晰。 – ken

+0

我已經更新了示例。從你最初的迴應中,我認爲我不夠清楚,即來自'attributeMap'的「value.name」是模型的屬性名稱,然後將其用作偏移量以從「獲取」適當的值模型。這就是我想要綁定到'item'的'value'屬性。 – ken