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!');

但是,如果我创建一个新项目并动态地添加一个任务,UI将添加新项目,但永远不会添加任何报价:

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-data库所取代。

为了使记录可用,它需要分配一个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

最新更新