2

我已经使用 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方法应该在实例化时运行并且它从不这样做,所以这里似乎有问题,但我无法解释它的相同之处确切的语法(除了 common-jsmodules.exportrequire语句)在 Fiddle 中工作。

任何和所有的帮助将不胜感激。

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

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

非工作的本地人

在此处输入图像描述

4

2 回答 2

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”文件。
  • 这导致了一个瞬态错误:
    • 我现在只有一个 ember 文件,vendor.js但 Ember 是在 ember-data 之后编译的
    • 这称为各种不由 common-js 管理的依赖问题(因为它们在 app.js 文件中)
    • config.coffee文件确实管理排序,但那时我注意到它指的是“rc.6”文件而不是“最新”文件,因此它没有给出Ember和Ember-Data之间所需排序的说明。嗯。
    • 虽然很容易修复,但我更改了config.coffee参考并且它起作用了。
  • 现在这很好,但我是如何首先得到两个文件的?
    • 好吧,我分叉的早午餐骨架(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

于 2013-07-18T12:14:18.077 回答
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()
});

它返回真实!出于某种我无法理解的原因,您的 App.Store 引用等于模型 App.Action !!!它拥有FIXTURES财产和一切!!

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

于 2013-07-17T17:03:25.373 回答