2013-09-05 2 views
0

В настоящее время я использую «ember-1.0.0-rc.7.js» для управления сохранением и хранением данных для моего приложения ember.Доступ к хранилищу данных контроллера и модели ember.js

user.js

App.User = DS.Model.extend({ 
    firstName:  DS.attr('string'), 
    lastName:  DS.attr('string'), 
    category:  DS.attr('string'), 
    status:  DS.attr('string'), 
    position:  DS.attr('string'), 
    fullName:  function() 
    { 
     return '%@ %@'.fmt(this.get('firstName'), this.get('lastName')) 
    }.property('firstName', 'lastName') 
}); 

App.User.FIXTURES = 
[ 
{ 
    id:   1, 
    firstName: 'Derek', 
    lastName: "H", 
    category: "admin", 
    status:  "offline", 
    position: "3232" 
}, 
{ 
    id:   2, 
    firstName: 'Jim', 
    lastName: "H", 
    category: "admin", 
    status:  "online", 
    position: "322" 
} 
]; 

UserListController.js

App.UserListController = Ember.ArrayController.create({ 
    content: [], 
    users: App.User.find() 
}); 

store.js

App.Store = DS.Store.extend({ 
    revision: 12, 
    adapter: 'DS.FixtureAdapter' 
}); 

Из сказанного выше, я предположил, что App.User.find() будет возвращать меня всех пользователей. Тем не менее, я получаю следующее сообщение об ошибке:

Ошибка От Firebug:

Your application does not have a 'Store' property defined. Attempts to call 'find' on model classes will fail. Please provide one as with 'YourAppName.Store = DS.Store.extend()' 
TypeError: store is undefined 

сообщение не имеет смысла, но в магазине определяется для приложения. Если хранилище не определено, то код ниже не работает.

В приведенном ниже коде я вызываю приложение App.User.find() в контексте маршрута, и он работает.

router.js

Bib.Router.map(function() { 
    this.resource('index', { path: '/' }); 
}); 


App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return ['a','b', 'c' ]; 
    }, 
    renderTemplate: function() { 
     this.render(); 
     this.render('userList', { outlet: 'userList', into: 'application', controller: App.UserListController });//render the list in list outlet 
    }, 
    setupController: function (controller, model) 
    { 
    controller.set('menu', model); 
    controller.set('test', App.User.find()); 
    } 
}); 

В index.html

<script type="text/x-handlebars" id="userList" data-template-name="userList"> 
    {{#each controller}} 
     {{firstName}} 
    {{/each}} 
</script> 

Я хочу туда-регулятора представлять UserListController и он имеет ссылку на пользователя модели. Имейте в виду, что я не могу подключить это на маршруте, так как у меня есть только один маршрут для этого приложения.

Я считаю, что это связано с контекстом, в котором я звоню. Другими словами, использование этого в контроллере. Возможно, я не понимаю фундаментальную концепцию о том, как связаны контроллеры и модели.

Любые советы оценили, Спасибо, D

+0

убедитесь, что вы определить ваш магазин ** ** Перед любой вызов '.find()' – intuitivepixel

ответ

4

Это можно сделать find звонки внутри контроллеров. Однако это не совсем то, что происходит в UserListController.js.

Вы звоните Ember.ArrayController.create вместо Ember.ArrayController.extend. То есть вы создаете глобальный экземпляр ArrayController, а не определяете новый класс контроллера.

В это время find звонок производится, когда оценивается UserListController.js, указанный вами магазин еще не установлен.

Вы можете увидеть это, удалив этот код, а затем оценив его в консоли браузера после запуска вашего приложения.

Однако создание глобального контроллера и установка вручную данных на нем - это шаблон, который обескуражен. Общий шаблон в приложениях Ember - создавать классы контроллеров, которые создаются, а затем заполняются данными по маршрутам.

Например:

App.Router.map(function() { 
    this.resource('user', { path: '/' }); 
}); 

App.UserIndexRoute = Ember.Route.extend({ 
    model: function() { 
    return App.User.find(); 
    } 
}); 

Это автоматически создаст UserIndexController, который является Ember.ArrayController и установить его content в App.User.find().

Теперь это упрощенный пример, а не то, что вы пытаетесь сделать. Похоже, вы хотите отобразить список пользователей, хранящихся в UserListController, в розетку на вашем основном шаблоне.

Для этого вам нужно будет что-то вроде:

App.Router.map(function() { 
    // you don't need to create an index resource 
    // an IndexRoute is created by default 
}); 

App.UserListController = Ember.ArrayController.extend(); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return ['a', 'b', 'c']; 
    }, 

    setupController: function (controller, model) { 
    controller.set('menu', model); 
    this.controllerFor('userList').set('content', App.User.find()); 
    }, 

    renderTemplate: function() { 
    var controller = this.controllerFor('userList'); 
    this.render(); 
    this.render('userList', {controller: controller}); 
    } 
}); 
+0

Да, это все еще не работает. У вас есть общее представление о том, что я собираюсь сделать. Я в основном хочу передать в userListController, который имеет доступ к модели User.find() в функцию, которая отображает шаблон. Поэтому в шаблоне я могу, например, {{#each controller}} {{firstName}} {{/ each}}. Я проверил код выше, и он не распознает контроллер. Я имею в виду, что я всегда могу идти по пути цикла через userList, который я определил в setupController, но это не похоже на правильное направление. – darewreck

+0

Я прояснил свой пример того, что я ищу. Он никогда не пытается распечатать данные. – darewreck

+0

фактически, ваш путь работал. Благодаря!!! – darewreck

2

Проблема, видимо, вызвана в users: App.User.find() линии. Вызов find(), вероятно, вызывается в то время, когда модель сначала оценивается, вероятно, до того, как ваш магазин определен. Ember Way (tm) должен использовать маршрут для настройки модели для вашего контроллера. Независимо от того, что возвращается из метода model на вашем маршруте, в вашем контроллере будет установлено свойство 'content'.

App.UserListRoute = Ember.Route.extend({ 
    model: function() { 
    return App.User.find(); 
    } 
}); 

App.UserListController = Ember.ArrayController.create({ 
    // you don't need anything here 
    // the model from the route will be set to 'content' 
}); 

Если вам нужно 'content' свойство быть пустым, и вам потребуется список, чтобы жить в 'users' собственности вы могли бы сделать это.

App.UserListRoute = Ember.Route.extend({ 
    setupController: function() { 
    this.controller.set('content',[]); 
    this.controller.set('users', App.User.find()); 
    } 
}); 

App.UserListController = Ember.ArrayController.create({ 
    // still don't need anything here 
}); 
+0

Да, это линия, которая является причиной вопрос. Проблема в том, что у меня есть только один маршрут (основной маршрут). Я хотел бы иметь различную визуализацию шаблонов с разными контроллерами и изолировать специфические функции самого контроллера, а также предоставлять возможности основному контроллеру. – darewreck

+0

обновил верх, чтобы отразить то, что я имел в виду и искал. – darewreck

Смежные вопросы