2017-06-13 11 views
0

2つのビューモデルでDevExtreme Schedulerを分離したいと考えています。 1つは実際のスケジューラ用であり、もう1つはポップアップを表示してボタンを処理することです。しかし、私はすべてを持っていますが、私はポップアップビューモデル内の関数を呼び出すことはできません。私のスケジューラインサイド他のビューモデル内のビューモデルで関数を呼び出すにはどうすればいいですか?

$(document).ready(function() { 

    var model = new viewModel(); 
    ko.applyBindings(model, document.getElementById("BookingScheduler")); 

    var popup = new viewPopup(); 
    ko.applyBindings(popup, document.getElementById("BookingPopup")); 

}); 

私は、クリックハンドラを持っており、その中に私がポップアップビューモデルであるloadData関数を呼び出すしたいと思います。

function viewPopup() { 
    function loadData(data) { 
    } 
} 

これは私がそれ popup.loadData(data);viewPopup().loadData(data);を呼び出そうとしましたし、それらのどれも動作しない方法です。 popup.loadData()は関数ではありません。どうすればそれを達成できますか?

+1

あなたのページに2つのビューモデルがあるのはなぜですか?1つしかない場合(サブビューモデルの場合)、問題はありません。 – Jamiec

答えて

0

私のスケジューラの中に私はクリックハンドラがあり、その中にはポップアップビューモデルにあるloadData関数を呼び出すことができます。

スケジューラviewmodelには、ポップアップビューモデルへの参照が必要です。 HTMLで

var App = function() { 
    this.scheduler = new viewModel(); 
    this.popup = new viewPopup(); 
} 

$(document).ready(function() { 
    ko.applyBindings(new App()); 
}); 

を:あなたがそれらを宣言し、通常、1つのメインのviewmodelを作成し、結合withを使用して、サブのviewmodelsをバインド

var popup = new viewPopup(); 
ko.applyBindings(popup, document.getElementById("BookingPopup")); 
var model = new viewModel(popup); 
ko.applyBindings(model, document.getElementById("BookingScheduler")); 
1

に参照を渡すためのラウンドスワップ

<body> 
    <div data-bind="with: scheduler" id="BookingScheduler"></div> 
    <div data-bind="with: popup" id="BookingPopup"></div> 
</body> 

、アル私はそれをお勧めしますかわからないけれども、あなたはpopupから$root.schedulerを使用して他のVMにアクセスすることができ、かつ$root.popupからschedulerまで。

より良いオプションは、インスタンス化時にpopupビューモデルへの参照を渡すことです。

第3の選択肢は、「ポストボックス」パターン(like this plugin by R. Niemeyer)を使用することです。

関連する問題