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 とブランチはありませんが) は、この 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-jsmodules.exportrequireステートメントを除く) が機能します。

ありとあらゆる助けをいただければ幸いです。

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

init検査のために App オブジェクトをコンソールに送信する ActivityRouteの関数に、別のデバッグ行を追加しました。私はそれがどのように見えるべきかについての専門家ではありませんが、これは強力な手がかりのように感じます。なぜなら、ローカルのインストールでは Store が であると主張して(unknown mixin)いるからですApp.Store

非稼働ローカル

ここに画像の説明を入力

4

2 に答える 2

4

わかりました、多くの苦労の末、私は今問題を解決しました。主に次のことが原因でした。

  • でファイルを複製/vendor/scripts

これがどのように実現したか、および以下のプロセスで遭遇した一時的な問題の詳細:

重複ファイル

  • ディレクトリを見ると、/vendor/scripts2 つの Ember スクリプト (ember-latest と ember-1.0.rc.6) があることに気付きました。皮肉なことに、 rc.6と呼ばれるものは実際にはrc.5ビルドでしたが、 ember-latest は実際にはrc.6 でした。いずれにせよ、2 つ持つことは明らかに面倒なことです。
  • 「ember-latest」ファイルの方が最新だったので、それを使用して「rc.6」ファイルを削除しました。
  • これにより、一時的なエラーが発生しました。
    • 現在、ember ファイルは 1 つしかありませんでしたvendor.jsが、ember は ember-data の後にコンパイルされていました。
    • これにより、common-js によって管理されないあらゆる種類の依存関係の問題が呼び出されました (app.js ファイルにあるため)。
    • ファイルはconfig.coffeeシーケンスを管理しますが、「最新」ファイルではなく「rc.6」ファイルを参照しているため、Ember と Ember-Data の間で必要なシーケンスを効果的に指示していないことに気付きました。うーん。
    • 簡単に修正できましたが、config.coffee参照を変更したところ、うまくいきました。
  • これは素晴らしいことですが、そもそもどうやって 2 つのファイルができたのでしょうか?
    • さて、私がフォークした Brunch スケルトン (brunch-with-ember-reloaded) には、最新の ember および emberdata ファイルをプルダウンする便利な方法を提供する Cakefile がありcake getemberますcake getemberdata
    • Emberdata は問題なく、そのディレクトリ内の Ember-Data の唯一の命名規則である ember-data-latest.js というファイルを作成します。
    • getemberただし、ember-latest.js というファイルが作成されますが、元のファイルは前述のember-1.0.rc.6ファイルでした。
    • そのため、事実上、Cakefile の自動化によってファイルが重複、新しくダウンロードされた Ember コードはブランチ ソリューションのターゲットではなく、静的な「rc.6」ファイルになりました。

エピローグ

その問題が解決されてうれしいと言わざるを得ません。まだ読んでいる方は、分岐したブランチ スケルトンに必要なすべての変更を加えたことに興味があるかもしれません。の代わりJavaScriptにコーディングできるようにCoffeeScript私のレポが変更されたことに注意してください。LESSStylus

スケルトン:残り火をサイドローディングしたブランチ

于 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他の明示的な割り当ては見当たりません。私のお勧めは、Brunch が何を必要としているのかを調べるかloader、著者が助けてくれる可能性のある著者に連絡することです。

于 2013-07-17T17:03:25.373 に答える