0

バインディングを使用してバインドするobservableArrayレコードがありtemplateます。これはうまくいきます。各レコードの変更を追跡したいので、 は でobservableArray構成されobservableます。これも機能します。

私が今欲しいのは、各レコード (つまり、各レコード) のいくつかのプロパティをobservable別の型に変換することです。

どのように進めればよいですか?

通常は a を使用できますcomputedが、この場合、複数のオブザーバブルが必要なため、単一のcomputedオブザーバブルを配列に追加することはできません。

では、どうすればこれを解決できますか?

4

2 に答える 2

1

監視可能な配列の項目であるパラメーターを受け取る関数をビューモデルに追加できます。バインディングはの内部で関数を実行するdependentObservableため、値にアクセスするオブザーバブルは依存関係を作成します。

したがって、たとえば、Ryan Niemeyerの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'。あなたの場合、これはあなたの観察可能な配列からのアイテムになります。

お役に立てれば。

于 2012-09-25T08:03:49.877 に答える
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>
于 2012-09-25T08:28:04.610 に答える