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

4 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
})
Run Code Online (Sandbox Code Playgroud)

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

Mil*_*Joe 8

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

您不需要create控制器,只需附加控制器类,extend无论是Ember.ArrayController对于集合还是Ember.ObjectController对于单个对象.

YIH.PhotosController = Em.ArrayController.extend();
YIH.PhotosPhotoController = Em.ObjectController.extend();
Run Code Online (Sandbox Code Playgroud)

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

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

YIH.Store = DS.Store.extend({
  revision: 12,
  adapter: 'DS.FixtureAdapter'
});
Run Code Online (Sandbox Code Playgroud)

要设置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);
    }
});
Run Code Online (Sandbox Code Playgroud)

即使你不写它,控制器也会收到model通过setupController它的通过Route.它看起来像这样:

SomeRoute = Em.Route.extend({
    setupController: function(controller, model) {
        controller.set('content', model);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以修改它.

我不确定您的JSON格式是否正确,因为您没有添加代码.无论哪种方式,每一个JSON对象应该有一个id属性,你的模型应该不会有一个id属性,除非您配置存储/适配器比一个主键不同id.在整个应用程序中,有时您将直接调用id,但有时您将不得不使用命名约定(例如:"照片"路径中的动态段).

对于这样的模型:

YIH.Photo = DS.Model.extend({
    url: DS.attr('string'),
    caption: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)

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

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'
    }
];
Run Code Online (Sandbox Code Playgroud)

你可能想检查这个样本小提琴:http://jsfiddle.net/schawaska/n3hY6/