2

私は達成したい非常に単純なことを持っていますが、それがどのように、または可能であるかさえわかりません。まず、ホット タオル テンプレートを使用しています。シェルビューモデルには、ユーザーが観察できるものがあります。私のサイトの他のページから観察可能なそのユーザーを参照できるようにしたいと思います。例えばホームページから。いくつか試してみましたが、構成されたビューからシェルにアクセスできるように見えません。現在、シェルからのイベント pub/sub 呼び出しを使用して、データが変更されるたびにリッスンしているユーザーにユーザー データを渡すという実用的なソリューションがあります (この例ではホーム ビュー)。これは機能しますが、少しぎこちなく、これを処理する理想的な方法ではありません。このユーザー オブザーバブルは、特定の機能をいつ利用できるようにするかを決定し、特定のユーザー プロジェクトを表示するために、サイト全体で使用する必要があります。

ホーム ビューからシェル ビューモデルに含まれるノックアウト オブザーバブルにデータ バインドする方法はありますか?

4

3 に答える 3

4

必要に応じてビュー モデルに含めるシングルトンを返す global.js を用意することを検討してください。

define(function () {

    return {
        sharedObservable: ko.observable(),
        sharedObservableArray: ko.observableArray(),
        ...
    };
});

ビューモデルでグローバルを使用します。

define([..., global], function (..., global) {
    ...
    global.sharedObservable('updated');

    // As an alternative use a local var for easier access
    // var localVar = global.sharedObservable;
    // localVar('updated') 
    ...

});
于 2013-05-23T19:18:20.680 に答える
0

最も簡単な方法は、requirejs を使用してシェル モジュールをビューモデルにインポートし、シェル ビューモデルをモジュールのビューモデルの変数として公開することです。

このようなもの:

// Some viewmodel
define(['shell'], function(shell){
     var vm = {
         shell: shell,
         ...
     };
     return vm;
});

次に、ビューで $root.shell を使用してバインドできます

<span data-bind="text: $root.shell.shellObservable"></span>
于 2013-05-24T10:58:40.863 に答える
0

以前の回答はどれもうまくいきませんでした。したがって、シェルへのアクセスの別のバリアントを試してみたところ、仕事は完了しました。

shell.jsにこれがあります:

    define(['plugins/router', 'durandal/app'], function (router, app) {
      return {
        // I need an access to this array in my view
        breadcrumbs: ko.observableArray([]), 
        ...
        };
   });

そして、これは私の見解では:

define(function () {
    var ctor = function () {
        this.pageTitle = 'Preview';
        this.activate = function () {
            require('viewmodels/shell').breadcrumbs([...]);
        };
    };
    return ctor;
});

したがって、require('viewmodels/shell') は実際にはシェル オブジェクトへの参照を返します。

于 2015-02-11T20:52:54.377 に答える