Windows store app Settings 的 应用 ( viewmodel + windows.storage)

1.在首页 加入 一个元素(加下滑线的)。此元素绑定了两个属性

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>App1</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0/js/ui.js"></script>

    <!-- App1 references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
    <script src="/js/util.js" type="text/javascript">
    
    </script>
</head>
<body>
    <div id="aa" data-win-bind="style.color:color;innerText:text" style="height: 40px;  100px"></div>
</body>
</html>

2.定义viewmodel, 并监听 viewmodel的属性变化。这样就可以在属性变化的时候,在更新UI的同时,去做想做的事。比如:更改本地存储。首页js 如下:

(function () {
    "use strict";

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
   WinJS.Application.onsettings = function (e) {

        //添加设置的选项
        e.detail.applicationcommands = {// href: 是设置相关信息使用的页面 | title: 就是 设置显示的文字 | color : 对应 settings.html 内 拥有 data-win-control="WinJS.UI.SettingsFlyout" 属性的元素的id
            "color": { href: "pages/settings.html", title: "更改字体颜色&内容" }
        };

        //把 自定义的设置选项 添加到 设置窗口
        WinJS.UI.SettingsFlyout.populateSettings(e);
    };


    app.onactivated = function (args) {
        if (args.detail.kind == activation.ActivationKind.launch) {

            //定义一个 ViewModel 
            WinJS.Namespace.define("ViewModel", {
                Settings: WinJS.Binding.as({
                    color: "red",
                    text: 'aaaasdasdasdsa'
                })
            });

            //需要观察的属性
            var settings = ['color', 'text'];

            //给 viewmodel 绑定 属性改变事件
            AddisonUitl.BindViewModelEvent(ViewModel.Settings, settings);

            WinJS.UI.processAll().then(function () {

                //绑定数据
                WinJS.Binding.processAll(document.getElementById('aa'), ViewModel.Settings);
            })
        }
    }

    app.start();
})();

3.因为在 添加自定义设置 选项的时候,需要一个设置页面,下面是 settings.html

<!DOCTYPE HTML>
<html>
<head>
    <title></title>
    <style>
        #colorsDiv #backbutton {
            color: #ffd800;
            border-color: #ffd800;
        }

        #colorsDiv div.win-header {
            color: white;
            font-weight: bolder;
            background-color: #0094ff;
        }
    </style>
    <script>
        WinJS.UI.Pages.define("pages/settings.html", {
            ready: function () {

                document.getElementById("backbutton").addEventListener("click", function () {
                    WinJS.UI.SettingsFlyout.show();
                    var bgColor = document.getElementById('bg').value,
                        text = document.getElementById('text2').value;

                    //更改viewmodel的属性值,触发 viewmodel bind的事件,从而去更改 本地存储的值。
                    ViewModel.Settings.color = bgColor;
                    ViewModel.Settings.text = text;
                });

            }
        });
    </script>
</head>
<body>
    <div id="color" data-win-control="WinJS.UI.SettingsFlyout">
        <div class="win-header">
            <button id="backbutton" class="win-backbutton"></button>
            <div class="win-label">Colors</div>
        </div>
        <div class="win-content">

            <h1>背景颜色</h1>
            <input id="bg" />

            <h1>更改内容</h1>
            <input id="text2">
        </div>
    </div>
</body>
</html>

4.下面是 util.js 的代码:

WinJS.Namespace.define('AddisonUitl', {

    /// <summary> </summary>
    /// <param name="name" type=""> property of ViewModel </param>
    /// <param name="eventType" type="">  the key in  param name </param>
    BindViewModelEvent: function (name, eventType) {
        var that = this;
        eventType.forEach(function (item, index) {

            //载入 用户设置 信息
            var valArray = Windows.Storage.ApplicationData.current.localSettings.values;
            if (valArray[item] != undefined) {
                name[item] = valArray[item];
            }

            //绑定属性改变事件
            name.bind(item, function (newVal, oldVal) {

                if (oldVal != null) {
                    that.storeSetting(item, newVal);
                    // that.updateViewModel(name, item, newVal);
                }
            })
        })
    },

    storeSetting: function (key, value) {
        var store = Windows.Storage;
        store.ApplicationData.current.localSettings.values[key] = value;
    },

    updateViewModel: function (name, key, value) {
        name[key] = value;
    }
})
原文地址:https://www.cnblogs.com/Mr-Joe/p/3195939.html