windows8 Metro APP JavaScript开发从零开始 - 基础篇(二)

在项目被创建完毕后, 第一个被自动打开的文件就是 default.js .

这个文件是整个应用运行的第一个js(内置的bas.js等除外)

 

与以住不同的是 第六行的代码.

WinJS.Binding.optimizeBindingReferences = true;

这行代码是在vs2012 rtm版中被加入的.   其作用是全局设定 是否防止自动设置元素ID. 也就是在数据绑定过程中, 是否阻止其自动给数据容器自动设定一个ID.

通常情况下,是不需要自动设定ID的. 用以避免Id的冲突.

 

由于default.js中的代码并不多.  我直接把注释写在代码中 全都贴上来. 大家看得也直观!

(function () {
    "use strict";

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    var nav = WinJS.Navigation;
    //给应用实例 添加 事件监听, 当应用启动后要执行的代码
    app.addEventListener("activated", function (args) {
        //确保在应用运行中(不是在挂起状态) 才执行其中的代码.
        if (args.detail.kind === activation.ActivationKind.launch) {
            //这里的判断作用 是区分 应用是全新执行的, 还是从挂起中被恢复的.
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { //全新执行时, 执行
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else { //挂起中恢复时, 执行!
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            //当应用运行时, 判断是否有 被保存的历史数据.  一般为应用挂起时保存在session中的数据.
            if (app.sessionState.history) {
                nav.history = app.sessionState.history;
            }
            //当页面的控件都准备好之后, 跳转到指定页面
            //如果nav.location有值,则跳转到 nav.location中保存的页面.   如果nav.location没有值,则跳转到应用首页
            /*
            说明一下下: 
            1) nav.location有值, 是因为应用在被挂起时所停留的页面的值. 应用被挂起后, 这个值是不会消失的.
               所以在恢复运行时, 这里就可以直接跳转到挂起之前停留的页面. 这部分代码是新增的, 在vs2012 rtm之前的模版中是没有这部分代码的.
            2) nav.location没值, 证明是全新执行的应用. 则跳转到应用首页.  
               应用首页在哪设置?  请看文章中的说明.
            */
            args.setPromise(WinJS.UI.processAll().then(function () {
                if (nav.location) {
                    nav.history.current.initialPlaceholder = true;
                    return nav.navigate(nav.location, nav.state);
                } else {
                    return nav.navigate(Application.navigator.home);
                }
            }));
        }
    });

    //oncheckpoint 是用来监听 应用挂起事件的.
    //默认给出的代码是 保存当前的历史操作数据到session中.
    //上面的代码 app.sessionState.history 中的值就是这里设置的.
    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. If you need to 
        // complete an asynchronous operation before your application is 
        // suspended, call args.setPromise().
        app.sessionState.history = nav.history;
    };

    //这个不用说了吧..哈哈
    app.start();
})();

 

下面作一下说明:

a)

session: 从事过服务端开发的同学们都知道 session这个东西.  我们的应用最终是安装在客户本地计算机上的, 那session要怎么保存呢? 当然没问题.

              WinJS.Application.sessionState这个对象就是所谓的session. 我们可以按照js操作对象的方式随意为它添加和删除成员.如:

 WinJS.Application.sessionState.someOne = {
    userID: 'test1',
    pwd: '******'
}


 WinJS.Application.sessionState['someOne'] = 'someString'

我们定义的值是保存在本地localState区域的.  它的地址是 C:\Users\[你的计算机用户名]\AppData\Local\Packages\[你的应用对应的packageID]\LocalState

其中的_sessionState.json文件.          与传统的session一样,当我们的应用会话结束后, session中的值也被清空.

 

b)

应用的home页:

在default.html页面可以找到下图中显示的元素, 应用程序的home是在data-win-options中定义的.

<body>
    <div id="contenthost" data-win-control="Application.PageControlNavigator" data-win-options="{home: '/pages/groupedItems/groupedItems.html'}"></div>
    <!-- <div id="appbar" data-win-control="WinJS.UI.AppBar">
        <button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{id:'cmd', label:'Command', icon:'placeholder'}" type="button"></button>
    </div> -->
</body>

而这个div 被解释为一个data-win-control 即控件.  而这个控件是模版生成时由开发平台帮我们实现的.  它是一个自定义控件.

Application.PageControlNavigator就是自定义的控件.  Application是命名空间,就是一个对象. PageControlNavigator就是一个class了. (class就是自定义的类).

自定义类的代码在 js文件夹下的 navigator.js中.

即然说到了自定义类, 那我就简单说一下vs2012  javascript项目中如何自定义一个类.

语法是: 

WinJS.Class.define(function, object, object);

第一个参数是一个方法, 可以理解成是主入口函数.  相当于 console 编程中的main方法. 这里面写的是逻辑.

第二个参数是一个对象, 我们可以把实现功能的函数放在这里.  比如入口函数中调用了a 方法,  我们就把a方法的具体实现写在这里.

第三个参数是一个对象, 这里存放类中需要引用的静态变量等.  (这个使用率不高)

 

大概写个例子,  类的自定义我会在之后的文章中详细说明.

var myClass = WinJS.Class.define(function(options){
      this.name = options.name; //类的成员变量
      this.xx = options.xx;            //类的成员变量    这部分可以看成是 构造函数作的事情.
      var obj = document.querySelector('#someid');  //这句的意思就是想区分开 公有变量和私有变量的区别.
      this.init(obj);    //这里就是逻辑调用,  我们完成功能需要调用 Init方法, 而方法的具体实现放在第二个参数中.
},
{
        init: function(tag){
                //我想说的是,  两个参数之间共用一个上下文.   所以在init方法中可以直接调用 this.name
                tag.innerHTML = this.name;
        },
        otherFunction: function(){
               //do something
        }
});

 

这时, 我们就可以调用这个自定义类了. 

var   obj = new myClass({
        name: 'test',
        xx: 'xx'
})



那么这个default.js页中的代码我们就说完了.   下次给大家详细说一下  navigator.js  文件中的代码.

回见!!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值