我已经使用 JSFiddle 在 Ember.JS 中成功构建了一个小型 UI 小部件。与 Ember-data Fixture Adapter 配合使用效果很好,但我想将其引入本地环境,并认为我应该使用 Brunch 为我构建环境。从那时起,我花了一整天的时间试图让它发挥作用,我希望有人能帮助我克服这个困难。我此时强烈怀疑剩下的问题要么是命名空间,要么是 Brunch 为您所做的 common-js 打包而产生的排序问题。我对 common-js 很陌生,所以这可能只是一个简单的缺乏理解......这是基本问题:
- 当我运行应用程序并移至
activities
模板时,出现断言失败:您的应用程序没有定义“Store”属性
错误。
我的初始化文件如下所示:
// 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}} 事件 View /模板/ Controller 时,就会出现问题。当然,事件是模型支持的唯一 View / Controller 。据我了解,流程从我的 ActivityRoute 开始:
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');
这应该会导致 DS.Store 的实例化,该实例存储在App.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.export
和 require
语句)。
任何和所有的帮助将不胜感激。
-=-=-=-=-更新-=-=-=-=-
我在 ActivityRoute 的 init
函数中添加了另一个调试行,用于将 App 对象发送到控制台进行检查。我不是它应该是什么样子的专家,但这感觉像是一个强有力的线索,因为本地安装声称商店是一个 (unknown mixin)
但在 JSBin 中运行时,商店报告为一个App.Store
:
最佳答案
好吧,经过一番痛苦之后,我现在已经解决了这个问题。这很大程度上取决于:
/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 getember
和cake获取emberdata
。 - Emberdata 很好,它会创建一个名为 ember-data-latest.js 的文件,这是该目录中 Ember-Data 的唯一命名约定。
getember
但是,会创建一个名为 ember-latest.js 的文件,但原始文件是前面提到的ember-1.0.rc.6
文件。- 因此,实际上,Cakefile 中的自动化导致了重复文件并且新下载的 Ember 代码不是Brunch 解决方案的目标,而是静态的“rc.6”文件。
- 我 fork 的 Brunch 框架 (brunch-with-ember-reloaded) 有一个 Cakefile,它提供了一种方便的方法来获取最新的 ember 和 emberdata 文件:
尾声
我必须说我很高兴解决了这个问题。如果您仍在阅读,您可能有兴趣知道我已经对我的 fork 早午餐骨架进行了所有必要的更改。请注意,我的存储库已修改为允许使用 JavaScript
编码而不是 CoffeeScript
,并且我还改用使用 LESS
处理器而不是手写笔
。
关于ember.js - 在 Ember 应用程序中找不到 DS.Store 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703919/