如何在Ember.js中将默认存储设置为FixtureAdapter?

时间:2013-03-08 19:37:58

标签: ember.js ember-data

我正在尝试使用Ember 1.0.0-rc1引导一个小应用程序。该应用程序将使用图像做一些事情。我还没有应用程序的任何后端,所以我试图在我嵌入网页源的一些JSON上使用FixtureAdapter。

不幸的是,我似乎无法正确地连接商店。我一直收到有关需要设置YourAppName.Store的错误。

  

未捕获错误:断言失败:您的应用程序没有   '商店'属性已定义。试图在模型类上调用'all'将会   失败。请提供一个'YourAppName.Store =   DS.Store.extend()'

但除非我完全错过了什么,否则我确实设置了它:

window.YIH = Ember.Application.create();

YIH.Photo = DS.Model.extend({
  url: DS.attr('string'),
});
YIH.Photo.FIXTURES = JSON.parse(document.getElementById('images').innerHTML);
YIH.Store = DS.Store.extend({
  revision: 12,
  adapter: DS.FixtureAdapter
});

YIH.photoController = Em.ArrayController.create({
  content: YIH.Photo.all(), // blows up
})

我一直在试图让这项工作设置其他属性,但无济于事。

1 个答案:

答案 0 :(得分:8)

更新:小提琴现在使用Ember RC2和Ember-Data rev 12

您不需要create控制器,只需将extend的控制器类和Ember.ArrayController附加到集合中,或Ember.ObjectController附加单个对象。

YIH.PhotosController = Em.ArrayController.extend();
YIH.PhotosPhotoController = Em.ObjectController.extend();

Ember将实例化这些控制器并在整个应用程序生命周期内对其进行管理。

要使用FixtureAdapter设置商店,请执行以下操作:

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

要设置控制器的content,建议通过路由进行设置,如下所示:

YIH.Router.map(function() {
    this.resource('photos', function() {
        this.route('photo', { path: ':photo_id' });
    });
});

YIH.IndexRoute = Em.Route.extend({
    redirect: function() {
        this.transitionTo('photos');
    }
});

YIH.PhotosRoute = Em.Route.extend({
    model: function() {
        return YIH.Photo.find();
    }
});

YIH.PhotosPhotoRoute = Em.Route.extend({
    model: function(params) {
        return YIH.Photo.find(params.photo_id);
    }
});

控制器将收到modelsetupController,即使您没有写入Route也会被SomeRoute = Em.Route.extend({ setupController: function(controller, model) { controller.set('content', model); } }); 。它看起来像这样:

id

如果您愿意,可以修改它。

我不确定您的JSON格式是否正确,因为您没有添加代码。无论哪种方式,每个JSON对象应该具有id属性,并且您的模型应该具有id属性,除非您将商店/适配器配置为具有不同于YIH.Photo = DS.Model.extend({ url: DS.attr('string'), caption: DS.attr('string') }); 。在整个应用程序中,有时你会直接调用id,但有时你必须使用命名约定(例如:“photo”路径中的动态段)。

对于这样的模型:

YIH.Photo.FIXTURES = [
    { id: 1,
      url: 'http://ecx.images-amazon.com/images/I/516cyMC9O7L.jpg',
      caption: 'Image 1'
    },
    { id: 2,
      url: 'http://ecx.images-amazon.com/images/I/51og8BkN8jL._SS250_.jpg',
      caption: 'Image 2'
    }
];

为了添加灯具,你必须提供这样的JSON:

{{1}}

您可能需要查看此示例小提琴:http://jsfiddle.net/schawaska/n3hY6/