【问题标题】:knockout with dynamic viewmodels动态视图模型的淘汰赛
【发布时间】:2011-12-21 12:40:16
【问题描述】:

互联网上有大量关于如何使用 Knockout 处理动态视图(通过 ajax 调用)的信息,但有动态视图模型的最佳实践吗?

例如,假设我有一个单页应用程序,它根据角色、用户选择、上下文等呈现(通过 ajax)不同类型的表单(具有不同的输入字段)。我不仅会为每个表单使用模板,但我想对视图模型做同样的事情,因为每个视图模型可能有许多非常不同的属性,并且为每个可能的模板都拥有一个庞大的视图模型是不切实际的。

我是一个 ko 的菜鸟,它可能不适合以这种方式使用。非常感谢任何建议。

【问题讨论】:

    标签: ajax viewmodel knockout.js


    【解决方案1】:

    我也面临同样的问题。

    试试Knockout Namespaces

    【讨论】:

      【解决方案2】:

      做这种事情的一种流行方法是拥有一个主视图模型来托管子视图模型。

      这是定义具有模板和关联数据的“模型”对象的一个​​非常基本的示例。

      function Model(key, template, data) {
         this.key = key;
         this.template = ko.observable(template);
         this.data = data; 
      }
      
      var viewModel = {
         models: ko.observableArray([
             new Model("user", "userTmpl", { first: "Bob", last: "Smith" }),
             new Model("item", "itemTmpl", { name: "MyItem", description: "Here are some details" })
         ]),
         selectedModel: ko.observable()
      };
      
      ko.applyBindings(viewModel);
      

      然后,你可以像这样使用它:

      <select data-bind="options: models, optionsText: 'key', optionsCaption: 'select a model...', value: selectedModel"></select>
      
      <hr />
      
      <div data-bind="with: selectedModel">
          <div data-bind="template: { name: template(), data: data }"></div>    
      </div>
      
      
      <script id="userTmpl" type="text/html">
          <span data-bind="text: last"></span>, <span data-bind="text: first"></span>
      </script>
      
      <script id="itemTmpl" type="text/html">
          <h3 data-bind="text: name"></h3>
          <div data-bind="text: description"></div>
      </script>
      

      http://jsfiddle.net/rniemeyer/29kWf/

      显然,您不太可能在选择中绑定模型的选择,但它有助于展示它是如何工作的。您的模型可以是属性名称与键匹配的对象,而不是数组。

      “模型”对象中的“数据”将是您的子视图模型。

      【讨论】:

      • 谢谢瑞恩,我想我开始更清楚地看到 KO。使用这种方法并添加 KO Mapping 插件将数据(名字、姓氏、名称、描述等)绑定为可观察对象是否正确?在我的场景中,我通过 ajax 提取数据。事实上,如果我最终通过 ajax 提取模板和数据,我应该能够在 Success 回调中调用“applyBindings”来连接所有内容——对吗?周末有空的时候我会试试这个。
      • 在这个想法下使用映射插件绝对没问题。在成功回调中调用applyBindings 很好。您真的只想调用一次,除非您传入第二个参数以将其限制为某个元素,并且只对非后代元素进行多次调用。否则,在我提供的示例中,您可以预先调用 applyBindings,直到填充 selectedModel 之前,实际上什么都不会绑定。
      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 2015-11-12
      • 2013-05-31
      • 2020-12-19
      • 1970-01-01
      • 2018-06-25
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多