かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

WinJSのRatingコントロールと双方向バインディング

RatingとspanをViewModelを介してバインドしてみたいと思います。

ViewModelは、JavaScriptでバインド可能なようにしておきます。

var viewModel = WinJS.Binding.as({
    averageRating: 5
});

次に、WinJS.UI.processAllの後にデータバインドをします。

WinJS.UI.processAll()
    .then(function() {
        WinJS.Binding.processAll(null, viewModel);

        var rating = document.querySelector("#rating").winControl;
        rating.onchange = function (e) {
            viewModel.averageRating = e.detail.tentativeRating;
        };
    });

Ratingコントロールには、ratingというidをふっています。あとはRatingコントロールとspanタグにバインドしておきます。

<div id="rating"
     data-win-control="WinJS.UI.Rating"
     data-win-options="{
        maxRating: 10
     }"
     data-win-bind="winControl.averageRating: averageRating">
</div>

<span data-win-bind="textContent: averageRating"></span>

実行するとこんな感じで★がつきます。

f:id:okazuki:20150101225642p:plain

★をチェックすると、数字も連動します。

f:id:okazuki:20150101225750p:plain

ソース全体

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="WinJS/css/ui-light.css" rel="stylesheet" />
    <script src="WinJS/js/base.js"></script>
    <script src="WinJS/js/ui.js"></script>
    <script src="WinJS/js/WinJS.js"></script>
    <title>こんにちは世界</title>
</head>
<body>

    <div id="rating"
         data-win-control="WinJS.UI.Rating"
         data-win-options="{
            maxRating: 10
         }"
         data-win-bind="winControl.averageRating: averageRating">
    </div>

    <span data-win-bind="textContent: averageRating"></span>

    <script type="text/javascript">
        WinJS.Application.onready = function () {
            var viewModel = WinJS.Binding.as({
                averageRating: 5
            });

            WinJS.UI.processAll()
                .then(function() {
                    WinJS.Binding.processAll(null, viewModel);

                    var rating = document.querySelector("#rating").winControl;
                    rating.onchange = function (e) {
                        viewModel.averageRating = e.detail.tentativeRating;
                    };
                });
        };
        WinJS.Application.start();
    </script>
</body>
</html>