Используется генератор нокаута Yeoman (в начале 2015 года), который включает в себя require.js и router.js. Просто используйте загрузчик KO.Нокаут: обратитесь к компоненту A, чтобы вызвать функцию A из компонента B?
Am попытки вызвать функцию (ko.observable или нет) в компоненте «а» от компоненты «б». Все ниже пуха пытается сделать просто:
// In componentB:
ComponentA.sayFoo();
Read KO документы на компоненты и погрузчиков, взломанных в течение нескольких часов, и т.д. Я не хочу накладных расходов сказать postal.js - и также не удалось получить подписки (KO pub/sub) для работы - я предполагаю по той же причине: модели представления, созданные таким образом, не имеют ссылок друг на друга (?) - поэтому подписчики в одном модуле не видят издатели в другой (правда?) (... немного над моей головой здесь% -)
1) Это потому, что модули не видят друг друга ... что этот сгенерированный код не помещает материал KO в глобальное пространство имен?
2) Попытка добраться от одного модуля к другому, кажется, зависит от получения ref через обратные панели, используя приведенную ниже функцию или это неверно? :
ko.components.get (name, callback) ;
startup.js использованием требуется выглядит следующим образом:
define(['jquery', 'knockout', './router', 'bootstrap', 'knockout-projections'], function($, ko, router) {
// Components can be packaged as AMD modules, such as the following:
ko.components.register('component-a', { require: 'components/a/component-a' });
ko.components.register('component-b', { require: 'components/b/component-b' });
// [Scaffolded component registrations will be inserted here. To retain this feature, don't remove this comment.]
// [Scaffold component's N/A (I think?)]
// Start the application
ko.applyBindings({ route: router.currentRoute });
});
(компонент) модуль А прямо вперед, как это:
define(['knockout', 'text!./component-a'], function(ko, templateMarkup) {
function ComponentA (params) { console.log ('CompA'); } ;
ComponentA.prototype.sayFoo = function() { console.log ('FOO!'); } ;
ComponentA.prototype.dispose = function(){};
return { viewModel: ComponentA, template: templateMarkup };
});
Аналогично , модуль B:
define(['knockout', 'text!./component-b'], function(ko, templateMarkup) {
function ComponentB (params) { console.log ('Compb'); } ;
ComponentB.prototype.doFoo = function() {
//// B Needs to fire ComponentA.foo() … SEE CODE ATTEMPT BELOW
};
ComponentB.prototype.dispose = function(){};
return { viewModel: ComponentB, template: templateMarkup };
});
Так вот где я застрял:
ComponentB.prototype.doFoo = function() {
ko.components.get ('component-a', (function (parms) {
console.log ('parms.viewModel : ' + parms.viewModel);
// parms.viewModel is (unexpectedly) undefined ! So how to get the ref?
console.log ('parms.template : ' + parms.template);
// does have expected html objects, eg. [object HTMLwhatever], [object HTML...]
})) ;
Это должно быть легко, или я беззвучно оставляя что-то очевидное !?
Возможно, модули необходимо определить/настроить по-другому?
Любые предложения помогут! Thx
thx vtosh - RE 4) - несмотря на то, что он не масштабируется и не является жестко закодированным, это может быть лучше ... Мне нужно всего лишь сделать несколько кросс-компонентных обменов. RE 3) часть проблемы заключается в том, что я использовал «консервированный» генератор без глубокого понимания всей созданной им архитектуры. Я не смог определить, что/где модель корневого представления: ko.applyBindings ({route: router.currentRoute}) - это ключ, но router.js запутан. Предложения о том, как это определить? thx снова –
См. обновленный ответ. – vtosh
оцените помощь здесь! Не удалось заставить редактируемую версию работать, хотя я думаю, что понимаю намерение. 'this.mySharedObservable = params && params.mySharedObservable;' дает неопределенные ... так что я думаю, что это не передано. Этот синтаксис выглядит странно - почему «params &&», а не только «this.mySharedObservable = params.mySharedObservable»? (Я тоже это пробовал, но все еще не определен). –