Model 控制器和模型数据存储访问ember.js

Model 控制器和模型数据存储访问ember.js,model,ember.js,controller,Model,Ember.js,Controller,我目前正在使用“ember-1.0.0-rc.7.js”来管理我的ember应用程序的持久性和数据存储 user.js App.User = DS.Model.extend({ firstName: DS.attr('string'), lastName: DS.attr('string'), category: DS.attr('string'), status: DS.attr('string'), posit

我目前正在使用“ember-1.0.0-rc.7.js”来管理我的ember应用程序的持久性和数据存储

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(),它就可以工作了

路由器.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>

{{{#每个控制器}}
{{firstName}}
{{/每个}}
我希望那里的控件表示UserListController,并使其具有对用户模型的引用。请记住,我无法将此连接到路由中,因为我只有一条路由用于此应用程序

我相信这是因为我打电话的背景。换句话说,在控制器中使用它。我可能不理解控制器和模型是如何相互关联的一个基本概念

感谢您的建议, 谢谢
D

问题可能是由
用户: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
});

问题可能是由
用户: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
});

可以在控制器内进行
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
,并将其
内容设置为
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});
  }
});

可以在控制器内进行
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
,并将其
内容设置为
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});
  }
});

确保在调用
.find()
之前定义存储。确保在调用
.find()
之前定义存储。是的,这是导致问题的原因。问题是我只有一条路线(主要路线)。我想用不同的控制器呈现不同的模板,并将特定的功能隔离到控制器本身,而不是将作用域赋予主控制器。是的,这就是导致问题的原因。问题是我只有一条路线(主要路线)。我想用不同的控制器呈现不同的模板,并将特定的功能隔离到控制器本身,而不是将作用域赋予主控制器。是的,这仍然不起作用。你有