4

私は奇妙な問題を抱えています、少なくとも私はそれが奇妙だと思います。

以下は何も表示しません。

<input type="text" data-bind="value: selectedAddress.street1" />

ただし、このようにバインドすると、正しい値が表示されますが、更新されません(値は表示されますが、オブジェクトにバインドされていないようです)。

<input type="text" data-bind="value: ko.toJS($data).selectedAddress.street1" />

selectedAddressオブジェクトに実際に次のデータが含まれているかどうかを確認しました。

JSON.stringify(ko.toJS(selectedAddress), null, 2)

そしてそれはします

{
 "id": 5631,
 "street1": "Some Adress 43",
 "street2": null,
 "postcode": "15850",
 "city": "GhostTown",
 "country": "UK",
 "addressTypes": []
}

入力フィールドをオブジェクトプロパティに正しくバインドし、それに応じて値を表示/更新するにはどうすればよいですか?

ViewModel:

var theViewModel = function() {
        var self = this;
        self.no = ko.observable();
        self.name = ko.observable();
        self.addresses = ko.observableArray([]);
        self.selectedAddress = ko.observable(new Address());
        ...
}

私は何が間違っているのですか?

4

3 に答える 3

3

括弧は一部の場合にのみオプションですが、オブジェクトのプロパティを参照する場合はオプションではありません(オブザーバブルの値である場合とそうでない場合があります)。したがって、observableの値を取得するには、括弧を明示的に使用する必要がありますselectedAddress。次に、street1このオブジェクトのプロパティを参照できます(括弧はオプションになりました)。

data-bind="value: selectedAddress().street1"
于 2012-06-09T23:36:28.440 に答える
2

これは一方向バインディングのソリューションです(値は更新されません)。

これはKnockoutJSドキュメントからの引用ですhttp://knockoutjs.com/documentation/value-binding.html

If you reference something that is not a simple property, e.g., a complex JavaScript expression or a sub-property, KO will set the form element’s initial state to that value, but it will not be able to write any changes back when the user edits the form element. In this case it’s a one-time-only value setter, not a real binding.

To get two-way binding functionality, use templates. Something like:

<script type="text/html" id="someTemplate">
    <input type="text" data-bind="value: street1" />
</script>

<div data-bind="template: { name: 'someTemplate', data: selectedAddress }"></div>
于 2012-07-07T12:35:08.787 に答える
0

If someone had the same issue and wondered about this part

self.selectedAddress = ko.observable(new Address());

And you might ask whether there's a need to create a constructor or an object to fill up the ko.observable function, well you can, but if you don't like creating a model for this one, just add up an empty array and the parenthesis method should work.

example :

self.selectedAddress = ko.observable([]);

then :

selectedAddres().street1

This may not work for other instances but so far it worked on me. Thank you for this answer too, saved me a lot of time!

于 2018-01-15T04:44:58.727 に答える