2017-06-13 121 views
0

我想在兩個視圖模型中分開我的DevExtreme調度器。一個用於實際的調度程序,另一個用於顯示彈出窗口並處理按鈕。然而,我擁有一切,但我無法調用Popup視圖模型中的函數。如何在另一個視圖模型中的視圖模型中調用一個函數?

$(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個viewmodels爲你的頁面 - 如果你只有1(也許與子視圖模型)沒有問題。 – Jamiec

回答

0

在我的調度程序中,我有一個點擊處理程序,在裏面我想調用彈出視圖模型中的loadData函數。

然後調度器viewmodel需要對彈出視圖模型的引用。交換圓你聲明它們,並通過在

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

通常參考的順序,您可以創建一個主視圖模型,並結合使用with子的ViewModels結合:

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

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

隨着HTML:

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

現在,雖然我不確定我會推薦它,但您可以使用$root.schedulerpopup和訪問其他虛擬機從scheduler

更好的選擇可能是在實例化時將參考傳遞給popup視圖模型。

第三個選項是使用「郵箱」模式(like this plugin by R. Niemeyer)。

相關問題