Javascript 同步组件注册
我有一个敲除组件,看起来像这样:Javascript 同步组件注册,javascript,knockout.js,Javascript,Knockout.js,我有一个敲除组件,看起来像这样: define(['knockout', 'text!./my-component.html', 'pubsub'], function(ko, htmlString, pubsub) { function viewModel(params) { } return { viewModel: { createViewModel: function(params, componentInfo) {
define(['knockout', 'text!./my-component.html', 'pubsub'], function(ko, htmlString, pubsub) {
function viewModel(params) { }
return {
viewModel: {
createViewModel: function(params, componentInfo) {
var vm = new viewModel(params);
pubsub('updateViewModel').subscribe(function(){
// update vm
});
return vm;
}
},
template: htmlString
};
});
<!-- ko component: "my-component" -->
<!-- /ko -->
我使用createViewModel
函数订阅更新事件,稍后我将使用该事件从其他组件触发组件viewmodel的更新
我在我的页面上包括以下内容:
define(['knockout', 'text!./my-component.html', 'pubsub'], function(ko, htmlString, pubsub) {
function viewModel(params) { }
return {
viewModel: {
createViewModel: function(params, componentInfo) {
var vm = new viewModel(params);
pubsub('updateViewModel').subscribe(function(){
// update vm
});
return vm;
}
},
template: htmlString
};
});
<!-- ko component: "my-component" -->
<!-- /ko -->
我已经读到ko.applyBindings
是同步的。但这是否也包括隐式的applybindings
到所有注册的组件,比如上面的mycomponent
?我是否需要将组件上的synchronous
属性设置为true
,以实现此目的?如果我理解正确,该标志仅与渲染相关
我想要避免的是一种竞争条件,即在订阅更新事件之前触发更新事件。ko.applyBindings可以在调用之前满足以下条件时同步操作:
ko.components.get
调用,并传递一个回调,该回调将在DOM上呈现组件
具有的定义。同步标志表示,如果组件已经缓存(在内存中),则不要放弃对线程的控制。只有在释放线程控制(setTimeout、DOM insert/wait等)时,applyBindings才会返回
我唯一不太确定的是RequireJS在这里的交互方式。knockout中有一段代码,它将尝试使用require first解析组件
在任何情况下,以下步骤都会让你更接近(不是完美的。请参阅下面的注释)
这方面几乎没有问题,所有问题都有解决方案
如果调用前满足以下条件,则ko.applyBindings可以同步操作:
ko.components.get
调用,并传递一个回调,该回调将在DOM上呈现组件
具有的定义。同步标志表示,如果组件已经缓存(在内存中),则不要放弃对线程的控制。只有在释放线程控制(setTimeout、DOM insert/wait等)时,applyBindings才会返回
我唯一不太确定的是RequireJS在这里的交互方式。knockout中有一段代码,它将尝试使用require first解析组件
在任何情况下,以下步骤都会让你更接近(不是完美的。请参阅下面的注释)
这方面几乎没有问题,所有问题都有解决方案
谢谢你的回答。在您的示例中调用
ko.components.get
回调时,是否可以安全地假设my component
的createViewModel
函数已完全执行?是的,这是一个安全的假设。我之所以说它是安全的,是因为如果您运行applyBindings,那么它将是ko.components.get的第一个订阅,而您将是第二个订阅(大约……)。这意味着您将在稍后收到通知,然后ApplyBinding的内部回调将感谢您的回答。在您的示例中调用ko.components.get
回调时,是否可以安全地假设my component
的createViewModel
函数已完全执行?是的,这是一个安全的假设。我之所以说它是安全的,是因为如果您运行applyBindings,那么它将是ko.components.get的第一个订阅,而您将是第二个订阅(大约……)。这意味着您将在稍后的时间点收到通知,然后是applyBindings内部的回调