Knockout在foreach中创建临时变量

时间:2017-07-25 09:06:36

标签: knockout.js

如何在foreach循环中创建临时变量...

AuthenticationFailed

我不想使用计算值和observables它是JS对象。

3 个答案:

答案 0 :(得分:0)

真实答案

使用计算属性制作视图模型,即使您不想这样做。

其他答案,向您展示为什么您应该选择真实答案

在视图中修改数据的唯一方法是编写自定义绑定,或者找到一种在常规绑定中执行代码的hacky方法。例如,如果您不想为普通对象创建视图模型,则需要将计算逻辑放在foreach绑定中。 (非常难看!)

在下面的示例中,我将data转换为foreach在视图中计算的内联中使用的$context。在计算中,您可以访问绑定上下文($parent)及其中的所有内容(如$parent)。你想做的所有事情(但不应该)都可以。

  • 访问每个项目的word_translated图层(此时,只是数据上下文)
  • 根据此图层中的信息
  • 为每个项目添加新属性(item.word_translated
  • 在foreach中的绑定中使用新属性:ko.applyBindings({ translations: { en: { "tree": "tree", "house": "house" }, nl: { "tree": "boom", "house": "huis" } }, language: ko.observable("en"), languages: ["en", "nl"], words: [{ index: 0, word: "house" }, { index: 1, word: "tree" } ] });



<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
Language: <select data-bind="options: languages, value: language">
</select>

<ul data-bind="foreach: { data: ko.computed(function() {
  return words.map(function(item) {
    return Object.assign({}, item, { 
      word_translated: translations[language()][item.word]
    })
  })
}), as: 'item' }">
  <li>
    <strong data-bind="text: item.index +': '"></strong>
    <span data-bind="text: item.word_translated"></span>
  </li>

</ul>
&#13;
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setJdbcUrl("jdbc:oracle:thin:@server01.intranet:1521/SERVER1")
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这就是你要找的东西:

modelName: Ember.computed('modelName',
  return this.get('modelName').map((o, i) => {
    return (i > 0 ? ' ' : '') + o.get('prop1') + '-' + o.get('prop2');
  });
})

答案 2 :(得分:0)

除非我弄错了,否则你可以在子范围内使用文字名称:

<!-- ko foreach: { data: question, as: 'question' }-->
    <!-- ko foreach: { data: question.answers, as: 'answer' }-->
    <span data-bind="text: question.lang ? answer[question.lang + '_name'] : answer.name">
    <!-- /ko -->
<!-- /ko -->

IMO这个代码更好地进入answer对象内的函数:

function getLocalizedText(question) {
    return question.lang ? this[question.lang + '_name'] : this.name;
}

所以标记看起来像

<!-- ko foreach: { data: question, as: 'question' }-->
    <!-- ko foreach: { data: question.answers, as: 'answer' }-->
    <span data-bind="text: answer.getLocalizedText(question)">
    <!-- /ko -->
<!-- /ko -->