2016-10-24 9 views
1

Я использую поддержку публикации/подписки для нокаута. Я понимаю, что мне нужно сделать следующее, чтобы получить возможность отправлять/считаны из топика:Может несколько замещающих сообщений в ту же тему в нокауте pubsub

var postbox = ko.subscribable(); 
var vendorTopic = 'vendorInfo'; 

//View model 1 
//Subscribe 
ko.subscribable.fn.subscribeTo = function(topic) { 
    postbox.subscribe(this, null, topic); 
    return this; //support chaining 
}; 
this.selectedVendor = ko.observableArray().subscribeTo(vendorTopic); 

//View model 2 
//Publish 
ko.subscribable.fn.publishOn = function (topic) { 
    this.subscribe(function (newValue) { 
     postbox.notifySubscribers(newValue,topic); 
    }); 
    return this; //support chaining 
}; 
this.vendor = ko.observableArray([]).publishOn(vendorTopic); 

Но, если мой viewmodel2 было 2 наблюдаемыми, и я хочу, чтобы иметь возможность получить доступ к обоим в моем viewmodel1, делать я нужно создать две темы - по одному для каждого наблюдаемого? Это звучит плохой дизайн, если у моего компонента есть 15 наблюдаемых, которые я хочу использовать в другом компоненте.

Но я не нашел другого полезного примера в Интернете. Любая помощь приветствуется!

+0

Как раз мысль, мы должны быть в состоянии отправить массив объектов, содержащих новые значения наблюдаемых, в пару пар ключ-значение, а затем внутри viewmodel1 мы можем проанализировать объект, правильно? – gkb

ответ

0

Как комментарии @gkb, вы можете передать сложный объект со всеми необходимыми значениями.

Для вашего кода я предполагаю, что вы используете knockout-postbox или по крайней мере получаете фрагменты кода из блога автора (knockmeout), и в этом случае вам нужно синхронизировать каждую наблюдаемую, используя для каждой темы другую тему.

let vm1 ={ 
    prop1:ko.observable().syncWith('prop1'), 
    prop2:ko.observable().syncWith('prop2'), 
    prop3:ko.observable().syncWith('prop3'), 
}; 

let vm2 ={ 
    prop2:ko.observable().syncWith('prop2'), 
} 

let vm3 ={ 
    prop1:ko.observable().syncWith('prop1'), 
    prop2:ko.observable().syncWith('prop2'), 
    prop3:ko.observable().syncWith('prop3'), 
} 

В этом примере каждое свойство будет синхронизировано во всех режимах просмотра.