2011-11-02 123 views
2

我一直在努力使用Sproutcore 2.0獲得綁定正確的一對多關係。Sproutcore 2.0一對多關係

我的模板是這樣的:

<script type="text/x-handlebars"> 
    {{#collection contentBinding="HTH.projectsController.content"}} 
    <h3>{{content.title}}</h3> 
    {{#collection contentBinding="content.tasks"}} 
    <span>{{content.title}}</span> 
    {{/collection}} 
    {{/collection}} 
</script> 

雖然實際的代碼如下所示:

HTH.Project = SC.Record.extend({ 
    title: SC.Record.attr(String), 
    tasks: SC.Record.toMany('HTH.Task',{ 
    isMaster: YES, 
    inverse: 'project' 
    }) 
}); 

HTH.Task = SC.Record.extend({ 
    title: SC.Record.attr(String), 
    project: SC.Record.toOne('HTH.Project', { 
    isMaster: NO 
    }) 
}); 

HTH.Project.FIXTURES = [ { guid: 1, title: 'Send man to moon', tasks: [1,2]}, 
         { guid: 2, title: 'Master handstand', tasks: [3]}]; 
HTH.Task.FIXTURES = [ { guid: 1, title: 'Find rocket', project: 1}, 
         { guid: 2, title: 'Find fuel',  project: 1}, 
         { guid: 3, title: 'Stand on hands', project: 2}]; 

HTH.store = SC.Store.create().from(SC.Record.fixtures); 

// Controllers 

HTH.projectsController = SC.ArrayProxy.create({ 
    content: HTH.store.find(HTH.Project) 
}); 

現在我可以更新的任務,而這些將更新UI。例如:

HTH.store.find(HTH.Project).get('firstObject').set('title','Updated the title!'); 

但是,如果我創建一個新項目,並動態地添加到用戶界面將增加新的項目任務,但從來沒有添加任何報價:

var project = HTH.store.createRecord(HTH.Project, {title: "New" }); 
var task = HTH.store.createRecord(HTH.Task, {title: "New task" }); 
project.get('tasks').pushObject(task); 

我敢肯定這是由於綁定不能按預期工作,或者需要觀察的屬性。誰能幫忙?

備註:SproutCore 2.0成爲Ember.js之前詢問過此問題。它還引用了SproutCore 1.x數據存儲的非官方端口,該存儲已被官方支持的ember數據庫取代。

回答

1

爲了使記錄可用,它需要爲assigned an ID

這意味着:

var project = HTH.store.createRecord(HTH.Project, {title: "New" }); 
var task = HTH.store.createRecord(HTH.Task, {title: "New task" }); 
project.get('tasks').pushObject(task); 

變爲:然後

var project = HTH.store.createRecord(HTH.Project, {title: "New" }, 123); 
var task = HTH.store.createRecord(HTH.Task, {title: "New task" }, 321); 
project.get('tasks').pushObject(task); 

的變化將反映在UI