Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步组件注册_Javascript_Knockout.js - Fatal编程技术网

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可以在调用之前满足以下条件时同步操作:

  • 所有组件都已注册
  • 所有组件视图模型都加载到内存中(从网络获取)
  • 所有组件模板都加载到内存中
  • 当组件viewmodel和模板不在内存中时,applyBindings变为异步(如果将synchronous设置为true,则为事件)

    此同步标志用于在来自的applybindings中播放。注意,组件绑定执行一个
    ko.components.get
    调用,并传递一个回调,该回调将在DOM上呈现组件

    具有的定义。同步标志表示,如果组件已经缓存(在内存中),则不要放弃对线程的控制。只有在释放线程控制(setTimeout、DOM insert/wait等)时,applyBindings才会返回

    我唯一不太确定的是RequireJS在这里的交互方式。knockout中有一段代码,它将尝试使用require first解析组件

    在任何情况下,以下步骤都会让你更接近(不是完美的。请参阅下面的注释)

    这方面几乎没有问题,所有问题都有解决方案

  • 需要等待多个组件完成加载

    [要解决此问题,您可以为每个组件创建一个承诺数组,并通过ko.components.get解析每个承诺。最后,您可以$.when(mypromiseArray,myCallback)同步所有承诺]

  • get不会告诉您组件最终在DOM上呈现的时间

    这是一个更具挑战性的问题。如果您需要这种精度,我将与您分享解决方案(您需要在50毫秒内知道组件何时加载并在UI上呈现)


  • 如果调用前满足以下条件,则ko.applyBindings可以同步操作:

  • 所有组件都已注册
  • 所有组件视图模型都加载到内存中(从网络获取)
  • 所有组件模板都加载到内存中
  • 当组件viewmodel和模板不在内存中时,applyBindings变为异步(如果将synchronous设置为true,则为事件)

    此同步标志用于在来自的applybindings中播放。注意,组件绑定执行一个
    ko.components.get
    调用,并传递一个回调,该回调将在DOM上呈现组件

    具有的定义。同步标志表示,如果组件已经缓存(在内存中),则不要放弃对线程的控制。只有在释放线程控制(setTimeout、DOM insert/wait等)时,applyBindings才会返回

    我唯一不太确定的是RequireJS在这里的交互方式。knockout中有一段代码,它将尝试使用require first解析组件

    在任何情况下,以下步骤都会让你更接近(不是完美的。请参阅下面的注释)

    这方面几乎没有问题,所有问题都有解决方案

  • 需要等待多个组件完成加载

    [要解决此问题,您可以为每个组件创建一个承诺数组,并通过ko.components.get解析每个承诺。最后,您可以$.when(mypromiseArray,myCallback)同步所有承诺]

  • get不会告诉您组件最终在DOM上呈现的时间

    这是一个更具挑战性的问题。如果您需要这种精度,我将与您分享解决方案(您需要在50毫秒内知道组件何时加载并在UI上呈现)


  • 谢谢你的回答。在您的示例中调用
    ko.components.get
    回调时,是否可以安全地假设
    my component
    createViewModel
    函数已完全执行?是的,这是一个安全的假设。我之所以说它是安全的,是因为如果您运行applyBindings,那么它将是ko.components.get的第一个订阅,而您将是第二个订阅(大约……)。这意味着您将在稍后收到通知,然后ApplyBinding的内部回调将感谢您的回答。在您的示例中调用
    ko.components.get
    回调时,是否可以安全地假设
    my component
    createViewModel
    函数已完全执行?是的,这是一个安全的假设。我之所以说它是安全的,是因为如果您运行applyBindings,那么它将是ko.components.get的第一个订阅,而您将是第二个订阅(大约……)。这意味着您将在稍后的时间点收到通知,然后是applyBindings内部的回调