【问题标题】:What is the reference for this Ember.js guides setupController multiple models with arraycontroller这个 Ember.js 使用 arraycontroller 引导 setupController 多个模型的参考是什么
【发布时间】:2013-09-16 22:15:19
【问题描述】:

目前我正在浏览 Ember.js 指南中的每一页和代码片段,并构建一个小型示例应用程序。有些我已经坚持了一段时间但解决了。然而,这个让我感到困惑。

http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ 它也在这里,但不使用 .get('songs") http://emberjs.com/guides/controllers/representing-a-single-model-with-objectcontroller/

App.SongsRoute = Ember.Route.extend({
  setupController: function(controller, playlist) {
    controller.set('model', playlist.get('songs'));
  }
});

我不知道 playlist.get('songs') 引用的是什么。我假设它是一个模型对象数组内部对象,但我显然错了。但由于他们网站上的示例代码没有可以使用的模拟存根数据,我只是从我所有的测试中猜测。

这里提供的代码有一些注释掉的位,看看我在测试什么。

<script type="text/x-handlebars" data-template-name="songs">
    <h1>Playlist</h1>
    <ul>
      {{#each}}
        <li>{{name}} by {{artist}}</li>
      {{/each}}
    </ul>
</script>

<script type="text/x-handlebars" data-template-name="playlist">
    <h3>Playlist: </h3>
</script>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/ember.js/1.0.0-rc.6/ember.min.js"></script>


<script type="text/javascript">
window.App = Ember.Application.create();

App.Router.map(function () {
  this.resource('songs');
  this.resource('playlist');
});

App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('songs');
  }
});

// App.SongsRoute = Ember.Route.extend({
//   setupController: function(controller, model) {
//     controller.set('model', model);
//   },
//   model: function () {
//     // return songs;
//     return playlist.songs;
//   }
// });

App.SongsRoute = Ember.Route.extend({

  playlist: function() {
    var playlist = { songs: [{fish: "fish"}, {fish: "fish"}] };
    return playlist;
  }.property(),

  setupController: function(controller, playlist) {
    controller.set('model', playlist.get('songs'));
  }
});

App.PlaylistRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    controller.set('model', model);
  },
  model: function () {
    return playlist;
  }
});

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

var songs = {
  duration: 777,
  name: 'Ember',
  artist: 'Jimmy Smith',
};

var playlist = {
  songs: [
    {
      id: 1,
      duration: 777,
      name: 'Ember',
      artist: 'Jimmy Smith',
    },
    {
      id: 2,
      duration: 888,
      name: 'jQuery',
      artist: 'Hyper Cat',
    }
  ]
};
</script>

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    不幸的是,这个链接 (http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/) 有点令人困惑。他们假设存在模型关系,但没有显示出来。

    他们假设有这样的事情:

    App.Playlist = DS.Model.extend({
      name : DS.attr('string'),
      songs : DS.hasMany('song',{async:true})
    });
    
    App.Song = DS.Model.extend({
      name : DS.attr('string')
    });
    

    然后通常您想要做的是从setupController 中的model 中提取集合,然后将其设置为content 在嵌套控制器上,该控制器已由主控制器need控制器。

    App.PlaylistRoute = Ember.Route.extend({
      setupController : function(controller,model){
        this._super(controller,model);
        this.controllerFor('songs').set('content',model.get('songs'));
      }
    });
    
    App.PlaylistController = Ember.ObjectController.extend({
      needs : ['songs']
    });
    

    然后由于您使用ArrayController 作为集合,如果您定义了sortPropertiessortAscending 属性,那么您已经内置了排序。

    App.SongsController = Ember.ArrayController.extend({
      sortProperties : ['name'],
      sortAscending : true
    });
    

    这是一个展示总体思路的 JSBin,使用 FixtureAdapter

    http://jsbin.com/ucanam/1073/edit

    【讨论】:

    • 哎呀!嗯,这就像 1、2 的水平曲线,跳过几个…… 24!让我修补一下,然后我会选择它作为已解决,非常感谢您的回答。我一直在尝试非常严格并使用提供的代码段而不更改它们,以证明我做事正确,即使他们的文档需要一些工作。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多