在Ember应用程序中找不到DS.Store实例化

时间:2013-07-17 15:25:48

标签: ember.js commonjs brunch

我已经使用JSFiddle在Ember.JS中成功构建了一个小UI小部件。使用Ember数据夹具适配器工作正常,但我想将它带入本地环境,并认为我会使用Brunch为我构建环境。从那时起,我浪费了整整一天试图让它工作,我希望有人可以帮我克服这个驼峰。我此时的强烈怀疑是,剩下的问题是由Brunch为您做的common-js包装产生的名称空间或排序问题。我对common-js很陌生,所以这可能只是一个简单的缺乏理解......这是基本问题:

  • 当我运行应用程序并转到activities模板时,出现Assertion failed: Your application does not have a 'Store' property defined错误。

我的初始化文件如下所示:

// Namespace
App = require('app');
// ===== Router =====
App.Router.map(function() {
    this.resource('index', { path: '/' }, function() {});
    this.resource('activities', { path: '/activities' }, function() {});
    this.resource('hi', { path: '/hi' }, function() {});

});
// ===== Routes =====
require('routes/ActivitiesRoute');

// ===== Store =====
require('stores/Fixture');

// ===== Models =====
require('models/Activity');

// ===== Views =====

// ===== Controllers ===== 
require ('controllers/ActivitiesController');

// ===== Template Helpers =====
require('helpers/time');

// ===== Templates =====
require ('templates/application');
require ('templates/hi');
require ('templates/activities');

代码的一个工作示例 - 尽管没有common-js和brunch - 可以在这个JSBin中找到:http://jsbin.com/oyosev/56/edit。在本地运行时,它会加载索引页面,并且可以在“hi”页面和索引之间来回导航而不会发生意外。当您{{#linkTo}}活动视图/模板/控制器时,会出现问题。活动 - 当然 - 是唯一由模型支持的视图/控制器。据我所知,流程从我的ActivitiesRoute开始:

App=require("app");

console.log("ActivitiesRoute file loaded");
module.exports = App.ActivitiesRoute = Ember.Route.extend({

    init: function() {
        console.log("ActivitesRoute instantiated!");
    },

    model: function() {
        return App.Activity.find();
    }

});

它成功实例化了对象(如下面的日志文件中所示),但随后尝试加载Activity模型,这是它注意到的地方......嘿,你还没有定义Store。问题是......我们已经或者至少我们已经尝试过了。出于参考目的,这里是有助于讲述执行故事的控制台消息:

console log

首先需要注意的是初始化脚本我们已经包含了一行:require('stores/Fixtures');,它应该导致存储在App.Store属性中的DS.Store的实例化。这是Fixtures.js文件:

App = require("app");

console.log("Store file loaded");
module.exports = App.Store = DS.Store.extend({
    init:function() { console.log("Store instantiated!"); },
    revision: 13,
    adapter: DS.FixtureAdapter.create()
});

你可以在控制台日志中看到(上面)确实已经加载了文件但是init方法应该在实例化时运行它从来没有这样做看起来这里有什么问题但是我在无法解释什么是相同的语法(除了common-js modules.exportrequire语句)在小提琴中工作。

非常感谢任何和所有帮助。

- = - = - = - = - UPDATE - = - = - = - = -

我在ActivitiesRoute的init函数中添加了另一个调试行,它将App对象发送到控制台进行检查。我不是它应该看起来像什么的专家,但这感觉就像一个强有力的线索,因为本地安装声称Store是(unknown mixin)但是当在JSBin中运行时,Store报告为App.Store

non-working local

enter image description here

2 个答案:

答案 0 :(得分:4)

好的,经过多次痛苦,我现在已经解决了这个问题。这主要归结为:

  • /vendor/scripts
  • 中的重复文件

我在下面的流程中遇到的更多有关如何通过和暂时性问题的详细信息:

重复文件

  • 我注意到 - 在查看/vendor/scripts目录时 - 有两个Ember脚本(ember-latest和ember-1.0.rc.6)。具有讽刺意味的是,名为 rc.6 的实际上是 rc.5 版本,而ember-latest确实是 rc.6 。在任何一种情况下,有两个显然是在寻找麻烦。
  • 因为“ember-latest”文件更新,所以我选择并删除了“rc.6”文件。
  • 然后导致了一个瞬态错误:
    • 我现在只在vendor.js中有一个余烬文件,但是在灰烬数据后编译了Ember
    • 这称为各种依赖问题,这些问题不是由common-js管理的(因为它们在app.js文件中)。
    • config.coffee文件确实管理了排序,但是当我注意到它指的是“rc.6”文件而不是“最新”文件时,所以它没有给出Ember和Ember之间所需顺序的指令。 -数据。哎呀。
    • 虽然很容易修复,但我更改了config.coffee引用并且它有效。
  • 现在这很棒但是 HOW 我最终得到了两个文件?
    • 我分叉的Brunch骨架(brunch-with-ember-reloaded)有一个Cakefile,可以方便地下载最新的ember和emberdata文件:cake getembercake getemberdata
    • Emberdata很好,它创建了一个名为ember-data-latest.js的文件,这是该目录中Ember-Data的唯一命名约定。
    • 但是,
    • getember会创建一个名为ember-latest.js的文件,但原始文件是前面提到的ember-1.0.rc.6文件。
    • 所以,实际上,Cakefile中的自动化导致重复文件新下载的Ember代码是Brunch解决方案的目标,而是静态“rc.6”文件。

后记

我必须说我很高兴将这个问题排除在外。如果你还在读书,你可能会有兴趣知道我已经对我的分叉Brunch骨架进行了所有必要的修改。请注意,我的repo已经过修改,允许进行JavaScript编码,而不是CoffeeScript,我也改用LESS处理器代替Stylus

骷髅:brunch-with-ember-sideloaded

答案 1 :(得分:1)

我看着回购。在控制台修修补补,给了我一些有趣的结果。

我在“存储已加载”日志后添加了以下日志。

console.log("Store file loaded");
console.log('App.Store === App.Action', App.Store === App.Action);
module.exports = App.Store = DS.Store.extend({
  revision: 13,
  adapter: DS.FixtureAdapter.create()
});

它返回true !!由于某些原因,我的App.Store引用等于App.Action模型!它具有FIXTURES属性和所有!!

我对此感到有些困惑,是不是模块加载器应该减轻这个?我没有看到任何其他明确的Store作业。我的建议是探索早午餐需要loader做什么,或者对作者提供帮助。