1

私はSPAを構築していますが、すべてうまくいっています。動的に構築される複数のビューモデルがあり、同じ種類が複数存在する可能性があります。つまり、ページ上の特定の div にバインドされた独自のモデルを持つ 2 つの計算機を開くことができます。

最近、いくつかのビューモデルが Web サービスから同じデータを要求しており、30 秒から 1 分ごとに一定のループが発生していることに気付きました。そのため、同じサービス コールが 30 秒ごとに複数回行われていましたが、同じ情報が返されていました。

したがって、私が理解しようとしているのは、複数のviewModelに変更を通知して更新できる「グローバル」なobservableArrayを作成する方法です。これは、ページ上のデータが一貫していることを確認するのにも役立ちます。

私は次のようなことができることを望んでいました:

var GlobalData = (function() {
    var commonData = ko.observableArray();
    setInterval(function() {...go get data...commonData(data);}, 30000);
    return {CommonData:commonData}
})();

ko.applyBindings(GlobalData, $('#RandomLonelyDiv')[0]);

じゃあ後で

function Calculator(element){
    function init() { ko.applyBindings(calculator, $(element)[0]); }
    var calculator = {
        CommonData = GlobalData.CommonData
    }
    return calculator;
}

他のすべてのビューモデルを含む MainViewModel を持っていない唯一の理由は、率直に言って自分の環境に設定する方法がわからないためです。

Windows と呼ばれる ko.observableArray を含む AppViewModel があります。これには、特定のウィンドウ タイプを構築するためのオプション/情報を定義するオブジェクトが含まれています。

<!-- ko template:{name:'WindowTemplate', foreach:SelectedTab().Windows} --><!-- /ko -->

次に、電卓などの特定のタイプの新しいビューモデルを作成する、変更された kendoWindow を作成するカスタム ウィンドウ バインディングがあります。しかし、これを始めたとき、そのビューモデルを AppViewModel に入れる方法がよくわかりませんでした。おそらくそれは単なる別の配列ですか?

4

2 に答える 2

3

本当に必要なのは「Pub/Sub」モデルのようです。これにより、世代や宛先を知らないメッセージをパブリッシュおよびサブスクライブできます。https://github.com/postaljs/postal.js/wikiをチェックしてください。

于 2013-09-27T16:12:18.400 に答える
2

これがあなたが探しているものかもしれないと思います:http://jsfiddle.net/xSKyR/474/

そのように、別のビューモデルのオブザーバブルにサブスクライブできます..

var ViewModel1 = function () {
    var self = this;
    self.something1 = ko.observable("1");
    self.clickMe = function (data, event) {
        self.something1("2");
    };
};
var ViewModel2 = function () {
    var self = this;
    self.something2 = ko.observable();
    vm1.something1.subscribe(function (newValue) {
        self.something2(newValue);

    });
};
var vm1 = new ViewModel1();
var vm2 = new ViewModel2();
ko.applyBindings(vm1, document.getElementById("vm1"));
ko.applyBindings(vm2, document.getElementById("vm2"));
于 2014-02-02T19:21:11.527 に答える