【问题标题】:Can't find DS.Store instantiation in Ember application在 Ember 应用程序中找不到 DS.Store 实例化
【发布时间】:2013-07-16 05:59:55
【问题描述】:

我已经使用 JSFiddle 在 Ember.JS 中成功构建了一个小的 UI 小部件。与 Ember-data Fixture Adapter 一起工作得很好,但我想把它带到本地环境中,并认为我会使用 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。问题是......我们已经或至少我们已经尝试过。以下是有助于讲述执行故事的控制台消息,仅供参考:

首先要注意的是,我们在初始化脚本中包含了这一行: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 方法应该在实例化时运行,但它永远不会这样做,所以这里似乎有问题,但我不知所措解释它在 Fiddle 中的相同语法(除了 common-js modules.exportrequire 语句)在 Fiddle 中起作用。

我们将不胜感激。

-=-=-=-=- 更新 -=-=-=-=-

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

【问题讨论】:

  • 注意:我确实注意到通过将我的 init 函数添加到 DS.Store.extend() 它在我的 Fiddle 中创建了错误,所以我已经从两者中删除了它但上面讨论的错误仍然存​​在不变。
  • 我正要说在你的初始化中调用this._super.apply(this, arguments)。 :)
  • 没有 jsbin 很难调试。否则,请尝试在线将生成的/连接的(非缩小的).js 发布到 gist 中。
  • 我已经在 J​​SFiddle 中包含了工作代码(JSBin 过去几天真的很不稳定):fiddle 但我假设你想要早午餐格式的所有文件......这是一个 github repo我用所有代码创建:ember-hello
  • 添加答案,cmets 不允许换行。

标签: ember.js commonjs brunch


【解决方案1】:

好的,在经历了很多痛苦之后,我现在已经解决了这个问题。主要是因为:

  • /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 文件,但 Ember 是在 ember-data 之后编译的
    • 这称为各种不由 common-js 管理的依赖问题(因为它们在 app.js 文件中)
    • config.coffee 文件确实管理序列,但那时我注意到它指的是“rc.6”文件而不是“最新”文件,因此它没有给出 Ember 和 Ember-Data 之间所需序列的说明.呸。
    • 虽然很容易修复,但我更改了 config.coffee 引用并且它起作用了。
  • 现在很好,但是我是如何首先得到两个文件的?
    • 我 fork 的 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 代码不是早午餐解决方案的目标,而是静态“rc.6”文件。

结语

我必须说我很高兴解决了这个问题。如果您仍在阅读,您可能有兴趣知道我已经对分叉的早午餐骨架进行了所有必要的更改。请注意,我的 repo 已修改为允许使用 JavaScript 编码而不是 CoffeeScript,并且我还切换到使用 LESS 处理器而不是 Stylus

骷髅:brunch-with-ember-sideloaded

【讨论】:

  • 酷,很高兴你把它修好了!
【解决方案2】:

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

我在您的“已加载商店”日志之后添加了以下日志。

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()
});

它返回真!出于某种我无法理解的原因,您的 App.Store 引用等于模型 App.Action !!!它具有FIXTURES 属性和所有!

我对此有点困惑,模块加载器不应该完全缓解这个问题吗?我没有看到任何其他明确的Store 分配。我的建议是探索早午餐需要loader 做什么,或者联系他可能能提供帮助的作者。

【讨论】:

  • 谢谢达山。我会看看我是否能得到早午餐团队的回应。这当然是一次令人沮丧的经历,但随着时间和像你这样的人的考虑,这种经历变得可以忍受。
  • 顺便说一句,我已经在ActivitiesRouter 的init 中添加了我自己的另一条调试行,以了解App 对象的状态。然后我在JSBin 中运行了同样的东西,并且有一个非常显着的区别。请参阅更新后的问题。
  • 我想我已经接近解决这个问题了。它与加入各种供应商 JS 文件的顺序有关。 Ember 需要在 EmberData 之前。需要弄清楚如何在早午餐中控制这一点。
猜你喜欢
  • 2014-10-19
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2016-09-22
  • 2017-08-12
相关资源
最近更新 更多