2017-01-18 3 views
1

У меня есть приложение ASP.NET, и я использую Knockout JS для некоторых минимальных задач в своем приложении. Однако у меня есть некоторые EditorTemplates, которые вычисляют значения для отображения. Я хочу получить доступ к этим значениям из некоторых других EditorTemplates. Я думал, что я мог бы использовать базовую функциональность паб/суб с Knockout, то есть я хотел бы написать в одном EditorTemplate код уведомления, например, так:Сделать доступным доступ к подписке на Nockout.JS глобально

new ko.subscribable().notifySubscribers(this.calculatedValue, "customTopic"); 

, а затем получить это значение, когда оно меняет в моей другой EditorTemplate

new ko.subscribable().subscribe(function (newValue) { 
     alert(newValue);    
    }, this, "customTopic"); 

Конечно, этот код не работает, так как я создаю new ko.subscribable() каждый раз.

Как создать единственный ko.subscribable, который доступен во всех моих представлениях?

ответ

1
  • Сначала вам нужно определить новый экземпляр subscribable переменной по всему миру.
  • Внутри других моделей подменю subscribe для подписной переменной, которую вы определили.
  • Уведомлять о любых подписчиках с использованием notifySubscribers при любых обновлениях.

Пример: https://jsfiddle.net/kyr6w2x3/149/

Вид:

<div id="one"> 
    <h1>MainVM:</h1> 
    <input type="text" data-bind="textInput:Name"> 
    <hr> 
    </div> 

    //------------------------------------------------- 
    <div id="two"> 
    <h1>SecondVM:</h1> 
    <div data-bind="text:NameSecondVM"> </div> 
    </div> 

Модель:

var shouterValueOfName = new ko.subscribable(); 

<script type="text/javascript"> 
    var MainViewModel = function(){ 
    var self = this; 
    self.Name = ko.observable(); 
    self.Name.subscribe(function (newValue) { 
     newValue = newValue ? newValue + " Sent from MainVM" : "" ; 
     shouterValueOfName.notifySubscribers(newValue, "secondVMTakeThis"); 
    }, self); 
    }   
</script> 

<script type="text/javascript"> 
    var SecondViewModel = function(){ 
    var self = this; 
    self.SecondVM = ko.observable(); 
    self.NameSecondVM = ko.observable(); 
    shouterValueOfName.subscribe(function (newValue) { 
     self.NameSecondVM(newValue); 
    }, this, "secondVMTakeThis"); 
    } 
</script> 
var viewModelA = new MainViewModel(); 
var viewModelB = new SecondViewModel(); 
ko.applyBindings(viewModelA, document.getElementById("one")); 
ko.applyBindings(viewModelB, document.getElementById("two")); 
+0

Это работает только если это написано в одном

Смежные вопросы