2

新しいホット タオル SPAプロジェクトを開始したばかりですが、ViewModel からのノックアウトとのバインドに問題があります。

私のビューモデルは次のようになります。

define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = ko.observable("Partners");


    return {
        title: title,
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});

ビューは次のようになります。

<section class="row-fluid">
    <div class="span10" id="admin-content">
        <h2 class="page-title" data-bind="text: title"></h2>
    </div>
</section>

しかし、タイトルは常にゴミになります (つまり、デバッガーを使用する場合のような関数のコード: FUNCTION D(){IF(0<ARGUMENTS.LENGTH) [...])

バインディングを "data-bind="text: title()" に変更すると機能しますが、これはオブザーバブルをバインドせず、値のみをバインドすることに気付きました。オブザーバブルを更新できず、値を保存できません。

私とまったく同じコードを使用しているように見える例を見つけましたが、それが機能しない理由がわかりません。

4

3 に答える 3

4

クリスチャン - あなたはそれを自分で考え出した. 詳しく説明します。

App_Start/bundleconfig.cs で定義されているベンダー バンドルを確認し、index.cshtml の下部近くにあるスクリプトの読み込みを確認します (29 行目まで)。

ノックアウト スクリプトを含むすべてのサード パーティ スクリプトが一緒に読み込まれることがわかります... Require の前に。つまり、サードパーティのスクリプトはいずれも、require の今後の使用を検出できません。したがって、グローバル名前空間 (ウィンドウ) に自身をロードします。

RequireJS が登場しても、これらのサービスのいずれも認識していません。そのため、依存関係として 'ko' を要求すると、null... が返されます。これは、関数の開始位置にブレークポイントを設定するとわかります。

これはすべて設計によるものです

これらのサービスを、require の IoC コンテナーに相当するものに詰め込むことができます。その場合、require は 'ko' を検出し、関数は機能します。これについては、ここで学び始めることができます。やりました。悪くない。

しかし、これらの海域でしばらく泳いでいる私たちの何人かは、それはあまりにも PITA であると判断しました. したがって、Durandal の単純化に関する推奨事項に従います。「いくつかのサードパーティ ライブラリを Require の外にロードし、グローバル名前空間に散らばらせます。より多くのアプリケーション ファイルは Require 内に配置する必要があります。

それ以外の選択はそれほど難しくありません。main.jsでrequire を shim することを学ぶだけで、ビジネスを始めることができます。

于 2013-02-27T17:45:59.090 に答える
3

この問題は、 https ://groups.google.com/forum/#!topic/durandaljs/Ku1gwuvqPQQ の Durandal 開発者の助けを借りて発見されました。

AMDを使用してノックアウトを含めることが問題だったようです。詳細はわかりませんが、Durandal がグローバルな ko 変数を使用しているのに対し、私のビュー モデルは ko 変数を使用しているという事実に関係していると思われます。これは、RequireJS が独自のインスタンスを作成したため、別のものでした。

于 2013-02-26T17:50:16.660 に答える
0

次のようなことを試してみてください:

define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = "Partners";


    return {
        title: ko.observable(title),
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});
于 2013-02-26T16:08:00.233 に答える