2013-11-23 51 views
0

我正在使用ember-model開發一個簡單的開發票應用程序,我是新來的ember,我無法修復這裏發生的事情,基本上我使用ember-model的hasMany來嵌入嵌套數據,(每個發票的項目都在一個數組中),我試着把代碼放在jsbin和jsfiddle中,但是它不能在那裏工作,所以對於那些有時間幫助我的人,我在這裏放置一個存檔在我的保管箱中:Ember-Model hasMany not updating in template's {{#each}}Ember-Model EmbeddedHasManyArray不在模板的每個幫助中更新

要重現錯誤,導航到發票,然後使用鏈接導航到另一張發票,看看沒有更新的項目就好像它們被卡住了一樣,但是如果你重新加載頁面,你會得到正確的項目,我是什麼做錯了:/?

下面的代碼當然是我的實際應用的一個非常簡化的版本,但它確實重現bug ..

由於任何人願意提供幫助。

的Index.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="description" content="Ember - Starter" /> 
    <meta charset=utf-8 /> 
    <title>Ember-Model</title> 
    <script src="libs/jquery-1.9.1.js"></script> 
    <script src="libs/handlebars-1.0.0.js"></script> 
    <script src="libs/ember-1.1.2.js"></script> 
    <script src="libs/ember-model-latest.js"></script> 
    <script src="app.js"></script> 
</head> 
<body> 

<script type="text/x-handlebars"> 
    <h1>Invoices</h1> 
    {{ outlet }} 
</script> 

<script type="text/x-handlebars" data-template-name="factures"> 
{{#each}} 
    <ul> 
     <li>{{#link-to 'facture' this}}{{title}}{{/link-to}}</li> 
    </ul> 
{{/each}} 
    <hr/> 
    {{outlet}} 
</script> 

<script type="text/x-handlebars" data-template-name="facture"> 
<h2>Items for {{title}}</h2> 
{{#each items}} 
<ul> 
    <li>{{desc}}</li> 
</ul> 
{{/each}} 
</script> 

</body> 
</html> 

App.js

var App = Ember.Application.create(); 

// ROUTER 
App.Router.map(function() { 
    this.resource('factures', function() { 
     this.resource('facture', { 
      path: '/:facture_id' 
     }); 
    }); 
}); 

App.FacturesRoute = Ember.Route.extend({ 
    model: function (params) { 
     return App.Facture.find(); 
    } 
}); 

App.FactureRoute = Ember.Route.extend({ 
    model: function (params) { 
     return App.Facture.fetch(params.facture_id).then(function (modelData) { 
      return App.Facture.find(params.facture_id); 
     }); 
    } 
}); 

// Redirect 
App.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('factures'); 
    } 
}); 


// MODELS 
var attr = Ember.attr, 
    hasMany = Ember.hasMany, 
    belongsTo = Ember.belongsTo; 

// Factures 
App.Facture = Ember.Model.extend({ 
    title: attr(), 
    items: hasMany('App.Item', { 
     key: 'items', 
     embedded: true 
    }) 
}); 

App.Facture.adapter = Ember.FixtureAdapter.create(); 

// Facture 
// -> [ Items ] 
App.Item = Ember.Model.extend({ 
    desc: attr(""), 
    qty: attr("number"), 
    price: attr("string") 
}); 

// FIXTURES 

App.Facture.FIXTURES = [ 
{ 
    id: 1, 
    title: "Invoice #1", 
    items: [ 
     {id: 1, desc: 'An Item for #1', qty: 2, price: "45"}, 
     {id: 2, desc: 'An Item for #1', qty: 5, price: "75"} 
    ] 
}, 
{ 
    id: 2, 
    title: "Invoice #2", 
    items: [ 
     {id: 1, desc: 'An Item for #2', qty: 2, price: "250"}, 
     {id: 2, desc: 'An Item for #2', qty: 5, price: "200"} 
    ] 
}]; 

回答

0

你的項目的ID應該是唯一的,如果它嵌入或不燼模型不關心,如果它看到相同的ID它返回該ID已經存在的模型。

http://emberjs.jsbin.com/eKibapI/1/edit

App.Facture.FIXTURES = [ 
{ 
    id: 1, 
    title: "Invoice #1", 
    items: [ 
     {id: 1, desc: 'An Item for #1', qty: 2, price: "45"}, 
     {id: 2, desc: 'An Item for #1', qty: 5, price: "75"} 
    ] 
}, 
{ 
    id: 2, 
    title: "Invoice #2", 
    items: [ 
     {id: 3, desc: 'An Item for #2', qty: 2, price: "250"}, 
     {id: 4, desc: 'An Item for #2', qty: 5, price: "200"} 
    ] 
}]; 
+0

非常感謝,我總是驚訝於解決方案似乎是多麼簡單,或者我是多麼愚蠢......我嘗試不在設備中爲項目設置任何ID,它也起作用。再次感謝。 – Wilhearts

0

我不知道爲什麼你在App.Facture.fetch()包裝App.Facture.find()。請注意,您的回調函數的return設置方式將不會由您的model鉤子返回。請嘗試以下操作:

App.FactureRoute = Ember.Route.extend({ 
    model: function (params) { 
     return App.Facture.find(params.facture_id); 
    } 
}); 

當然這也是默認的行爲,所以你應該能夠只是刪除整個App.FactureRoute

+0

我這樣做是爲了返回一個承諾,因爲在我的應用程序中,模板用於在接收項目之前進行渲染,這樣模板在承諾完成之前不會呈現(並且應用程序保留在LoadingRoute中)並且一切正常。 – Wilhearts

+0

您應該可以改爲使用App.Facture.find({id:params.facture_id})。如果我沒有錯,應該返回一個承諾。 – chopper

+0

是的,我嘗試沒有嵌套在一個提取,它似乎現在工作,我很困惑>< – Wilhearts