2013-07-18 85 views
0

在Ember.js中,如果您有一個具有一對多關係的模型,可以根據父模型的屬性生成鏈接?Ember.js:如何在url路徑中使用父模型的屬性?

例如,我有一個模型,像這樣一些數據:

var SuggestionGroup = Ember.Model.extend({ 
    id: Ember.attr('number'), 
    name: Ember.attr('string'), 
    suggestions: Ember.hasMany('App.Suggestion', { 
     key: 'suggestions', 
     embedded: true 
    }) 
}); 

SuggestionGroup.adapter = Ember.FixtureAdapter.create(); 

SuggestionGroup.FIXTURES = [ 
{ 
    id: 1, 
    name: 'Start', 
    suggestions: [ 
     { 
      id: 1, 
      title: 'Fetching coffee and cake for the Interface Developers', 
      description: 'Because they\'re so brilliant', 
      upVotes: 10, 
      downVotes: 2 
     }, 
     { 
      id: 2, 
      title: 'Criticising the app devs more', 
      description: 'They enjoy a bit of banter', 
      upVotes: 8, 
      downVotes: 4 
     }, 
     { 
      id: 3, 
      title: 'Not updating JIRA', 
      description: 'It\'ll be funny when the PMs start raging', 
      upVotes: 1000000, 
      downVotes: 0 
     } 
    ] 
}] 

這裏是我的路線:

App.Router.map(function() { 
    this.resource('current-suggestions'); 
    this.resource('suggestion', { 
     path: '/current-suggestions/:suggestion_id' 
    }); 
}); 

我的模板是這樣的:

{{#each model}} 
<td> 
    <ul> 
    {{#each suggestions}} 
     <li class="suggestion"> 
      <h3> 
       {{#linkTo 'suggestion' this}}{{title}}{{/linkTo}} 
      </h3> 
     </li> 
    {{/each}} 
    </ul> 
</td> 
{{/each}} 

所以,目前我的路徑是current-suggestions/1。但我想要做的是有路徑,如current-suggestions/Start/1。所以,路徑是使用父模型的屬性生成的。

是否有可能做到這樣的事情?

+1

爲什麼不在孩子中放置一個'belongsTo'關係?然後,您可以使用get()獲得父對象的引用,然後獲取所需的任何屬性。 – GJK

+0

@GJK它不訪問我遇到問題的父項屬性。我想使用父母的'name'屬性爲每個'Suggestion'創建一個路徑。所以如果一個'Suggestion'的父母的名字是'開始',那麼路徑將是'current-suggestions/Start/1',或者如果是'Stop',那麼'current-suggestions/Stop/1'。 –

+0

啊,我明白了。我想象這樣做的方式是使用動態細分市場,但是我還不夠完善Ember.js,但還不知道如何去做。 – GJK

回答

1

來自@GJK的最新評論已經指出了正確的方向,但讓我提出一個有點詳細的答案來解決您的問題。你可以做到這一點

一種方法是掛接到您的SuggestionRouteserialize功能,並提供缺少的動態段最終到達網址應該有,在概念上這將是這樣的:

額外的動態段添加到您的

App.SuggestionRoute = Ember.Route.extend({ 
    ... 
    serialize: function(model) { 
    var id = model.get('id'); 
    var name = model.get('name'); 
    return { 
     name: name, suggestion_id: id 
    } 
    } 
}); 
:路由定義,你的情況 :name

App.Router.map(function() { 
    this.resource('current-suggestions'); 
    this.resource('suggestion', { 
    path: '/current-suggestions/:name/:suggestion_id' 
}); 
}); 

然後進行動態段像這樣提供的數據

注意:此解決方案假定您爲Suggestion模型提供了父模型的name屬性,爲實現此目的,您可以重新考慮模型關係。

並激勵你你如何可以重構你的應用程序,以實現自己的目標(具有類似於/current-suggestions/Start/1等的URL)看看這裏:

Demo

我試圖模仿你用例但採用不同的方法。

我希望它有幫助。

+0

非常感謝這就是我要找的。最初生成路徑的方式有些奇怪。你會注意到錨的'href'包含一個'null',這個組的名字應該是。但是,當你點擊鏈接時,url的名稱不是'null'。然後,如果你回到建議列表中,錨'href'不再有'null'了。你知道爲什麼會發生這種情況嗎? –

+1

問題是,當模型第一次被髮送到'serialize'方法時,它尚未被加載。這就是爲什麼沒有定義模型的屬性(這對我來說似乎是一個錯誤)。我設法通過監聽模型何時加載,然後觸發模板的重新渲染來解決這個問題。 –

相關問題