2013-03-08 86 views
4

我试图引导与Ember 1.0.0-RC1的小型应用程序。应用程序将使用图像做一些事情。我没有任何应用程序的后端,所以我试图在我已经嵌入到网页源代码中的一些JSON上使用FixtureAdapter。如何在Ember.js中将默认商店设置为FixtureAdapter?

不幸的是,我似乎无法正确挂钩的商店。我不断收到有关需要设置YourAppName.Store的错误。

Uncaught Error: assertion failed: Your application does not have a 'Store' property defined. Attempts to call 'all' on model classes will fail. Please provide one as with '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 
}) 

我砍死周围试图使这项工作设置其他属性,但无济于事。

+0

http://emberjs.com/guides/getting-started/using-fixtures/ – hiwaylon 2013-11-30 17:25:46

回答

8

更新:小提琴现在使用灰烬RC2与Ember,数据启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); 
    } 
}); 

的控制器将获得model通过setupController被烤成Route,即使你不写它。它看起来像这样:

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

并且你可以修改它,如果你想。

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

对于这样一个模型:

YIH.Photo = DS.Model.extend({ 
    url: DS.attr('string'), 
    caption: DS.attr('string') 
}); 

为了增加赛事,你必须提供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' 
    } 
]; 

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

相关问题