Использовался генератор Yeoman's Knockout (приблизительно начало 2015 г.), который включает в себя require.js и router.js. Просто с помощью загрузчика KO.
Я пытаюсь вызвать функцию (ko.observable или нет) в компоненте "a" из компонента "b". Весь пух ниже пытается сделать просто:
// In componentB:
ComponentA.sayFoo();
Читал документы KO по компонентам и загрузчикам, часами взломал и т. д. Я не хочу, чтобы накладные расходы, скажем, postal.js — и также не мог заставить подписки (KO pub/sub) работать — я Полагаю, по той же причине: настроенные таким образом модели представления не имеют ссылок друг на друга (?) - поэтому подписчики в одном модуле не видят издателей в другом (правильно?) (... немного выше моего понимания здесь %-)
1) Это из-за того, что модули не видят друг друга… что этот сгенерированный код не помещает материал KO в глобальное пространство имен?
2) Попытка добраться из одного модуля в другой, кажется, зависит от получения ссылки через параметры обратного вызова, используя функцию ниже, или это неправильно? :
ko.components.get (name, callback) ;
startup.js с использованием require выглядит следующим образом:
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 });
});
(Компонент) модуль A прямолинеен, например:
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...]
})) ;
Это должно быть легко, или я тупо упускаю что-то очевидное!?
Может быть, модули нужно определить/настроить по-другому?
Любые предложения помогут! Спасибо