转换Knockout.js中的observable属性

时间:2012-09-25 07:43:16

标签: knockout.js

我有observableArray个记录,我使用template绑定绑定。这很好用。由于我想跟踪每条记录的变化,observableArrayobservable组成。这也有效。

我现在想要的是将每个记录的某些属性(即每个observable)转换为不同的类型。

我该怎么办?

通常,我可以使用computed,但在这种情况下,我无法向数组添加单个computed observable,因为我需要多个{。p>

那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以向视图模型添加一个函数,该函数接受一个参数,该参数是可观察数组中的项。绑定将在dependentObservable内运行函数,因此任何访问其值的observable都将创建依赖。

因此,例如,从Ryan Niemeyer's jsFiddle开始,您可以使用以下标记:

type "one", "two", or "three": <input data-bind="value: text" /> 
<hr />
<ul data-bind="template: { name: 'itemTmpl', foreach: items }"></ul>

<script id="itemTmpl" type="text/html">
    <li data-bind="text: name, visible: viewModel.shouldThisBeVisible(name)"></li>
</script>​

..使用视图模型:

var viewModel = {
    text: ko.observable("one"),
    items: [{name: "one"}, {name: "two"}, {name: "three"}],
};

viewModel.shouldThisBeVisible = function(name) {
    return this.text() === name;
}.bind(viewModel);

ko.applyBindings(viewModel);​

关键位是函数采用'name'参数的位置。在您的情况下,这将是您的可观察数组中的项目。

希望这有帮助。

答案 1 :(得分:1)

这是一个使用视图模型包装observableArray的每个项目的解决方案。然后,此视图模型可以包含计算属性。

var ItemViewModel = function (value) {
    this.value = ko.observable(value);
    this.computedValue = ko.computed(function () {
        return this.value() * 2;        
    }, this);    
};

var ViewModel = function (list) {
    var self = this;
    self.list = ko.observableArray([]);                
    ko.utils.arrayForEach(list, function (value) {
         self.list.push(new ItemViewModel(value)); 
    });
};

ko.applyBindings(new ViewModel([1,2,3]));


<ul data-bind="foreach: list">
<li data-bind="text: computedValue"></li>
</ul>