javascript - 获取组件的异步 View 模型

标签 javascript knockout.js

我想从服务器获取 View 模型并在我的组件中使用它。是否可以?我的尝试,显然行不通:

function getDummyViewModelAsync(){
   setTimeout(function(){
       cb({ foo: 1 });
   }, 500);
}

ko.components.register('my-component', {
   viewModel: {
       createViewModel: function(params, componentInfo) {

           getDummyViewModelAsync(function(viewModel){
               return viewModel;
           });
       }
   },
   template: ...
});

最佳答案

从我们在评论中的交流中不清楚您想要做什么而动态加载模块无法完成。您可以动态加载模块结构,当然也可以动态填充其中的元素。

如果您想手动完成所有操作,也可以这样做。将您的 View 模型传递给获取函数。让获取函数返回一个 promise ,并在获取数据并将其放入 View 模型时解析它。您的模板甚至可以动态引用其他模板,因此您在加载时看到一件事,在完成后看到另一件事。

function getDummyViewModelAsync(populateMe) {
  return new Promise(
    function(resolve, reject) {
      setTimeout(function() {
        populateMe.cb = ko.observable('A value');
        resolve('whatever');
      }, 500);
    }
  );
}

ko.components.register('my-component', {
  viewModel: {
    createViewModel: function(params, componentInfo) {
      var vm = {
          template: ko.observable('loading'),
          ready: ready
        },
        ready = getDummyViewModelAsync(vm);
      ready.then(function() {
        vm.template('ready');
      });
      return vm;
    }
  },
  template: document.getElementById('selector').innerHTML
});

console.clear();
ko.applyBindings();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<template id='loading'>
  Loading...
</template>
<template id='ready'>
  Ta da!
  <div data-bind="text: cb"></div>
</template>
<template id='selector'>
  <!-- ko template: template -->
  <!-- /ko -->
</template>

<my-component></my-component>

关于javascript - 获取组件的异步 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025403/

相关文章:

javascript - 有没有办法使用 knockout 可观察值动态更改输入字段的大小?

javascript - KnockoutJS 绑定(bind)未使用可观察集合进行更新

jquery - Knockoutjs,jquery 移动 slider

asp.net-mvc - knockout js引导日期选择器

javascript - 函数内循环

javascript - 函数只返回第一个值

javascript - 如何从外部 Html 文件获取 Google Apps 脚本中的ElementById?

javascript - JavaScript 过滤器的替代返回 - 如果未找到客户端则显示消息

javascript - 如何用垂直折线图填充区域?

javascript - 为什么我不能在同一个表中两次使用 datepicker?