Sproutcore 2.0 отношения один ко многим - PullRequest
2 голосов
/ 03 ноября 2011

Я изо всех сил пытался получить правильные привязки для отношения один ко многим, используя 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)
});

Теперь я могу обновлять задачи, и они будут обновлять пользовательский интерфейс. Например:

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-data.

1 Ответ

1 голос
/ 04 ноября 2011

Для того, чтобы запись могла быть использована, ей необходимо присвоить идентификатор .

Это означает, что:

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

Изменения будут отражены в пользовательском интерфейсе

...