Windows runtime WinJS变量/对象范围、设置和事件?

Windows runtime WinJS变量/对象范围、设置和事件?,windows-runtime,winjs,Windows Runtime,Winjs,我不确定这个问题的正确标题应该是什么。我是WinJS新手,来自.NET网络表单和winclient背景 这是我的设想。我有一个导航WinJS应用程序。我的结构是: default.html (导航控制器) (设置弹出按钮) pages/Home.html pages/Page2.html 因此,在default.js文件的顶部,它设置了以下变量: var app = WinJS.Application; var activation = Windows.ApplicationModel.

我不确定这个问题的正确标题应该是什么。我是WinJS新手,来自.NET网络表单和winclient背景

这是我的设想。我有一个导航WinJS应用程序。我的结构是:

  • default.html
    • (导航控制器)
    • (设置弹出按钮)
  • pages/Home.html
  • pages/Page2.html
因此,在default.js文件的顶部,它设置了以下变量:

var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;
似乎我无法在设置弹出按钮或任何页面中的任何位置使用这些变量:ready函数。它们的作用域仅限于default.js

在同样的方面,互联网站(链接)上是否有显示如何在我的每个“页面”之间正确共享变量、事件和数据的资源

我需要立即克服的情况是设置。在“我的设置”弹出按钮中,我读取并允许用户选择设置以下应用程序设置:

var applicationData = Windows.Storage.ApplicationData.current;
var localSettings = applicationData.localSettings;

localSettings.values["appLocation"] = {string set by the user};

我想在default.js文件中或者甚至在导航页面中响应该事件,但我不知道在哪里“侦听”。我的直觉是监听afterhide事件,但如何将其范围返回到我想要监听的页面?

当您更改需要实时更新的数据时,请调用
applicationData.signalDataChanged()
。然后在需要获取更改通知的地方,收听applicationData对象上的
datachanged
。这也是在计算机之间同步漫游设置时引发的事件


我发现很多时候,即时通知(引发的事件)是不必要的。当需要该值时,我只需再次查询设置(例如在
ready
中)。

当您更改需要实时更新的数据时,请调用
applicationData.signalDataChanged()
。然后在需要获取更改通知的地方,收听applicationData对象上的
datachanged
。这也是在计算机之间同步漫游设置时引发的事件


我发现很多时候,即时通知(引发的事件)是不必要的。我只是在需要值时再次查询设置(例如在
ready
中)。

Bryan。我是福斯特。如果你移动你提到的线

var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;
…在即时功能之外,它们将处于全局范围,您可以在任何地方访问它们。这是我在应用程序中首先做的事情之一。您将听到关于使用全局范围的警告,但人们试图避免的是删除全局范围中所有内容的模式。只要你能控制你放进去的东西,你就没事了

所以把它们放在default.js上立即函数的开头之前

//stuff here is scoped globally
var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;

(function () {
    //stuff here is scoped to this file only
})();
如果您正在保存一些数据,并且只需要将其保存在内存中,则可以将其挂起,而不保存到本地存储中。这将使整个应用程序都可以使用它

//on Page2.js
app.myCustomVariable = "some value";

//on Page3.js
if(app.myCustomVariable == "some value") ...

布莱恩。我是福斯特。如果你移动你提到的线

var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;
…在即时功能之外,它们将处于全局范围,您可以在任何地方访问它们。这是我在应用程序中首先做的事情之一。您将听到关于使用全局范围的警告,但人们试图避免的是删除全局范围中所有内容的模式。只要你能控制你放进去的东西,你就没事了

所以把它们放在default.js上立即函数的开头之前

//stuff here is scoped globally
var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;

(function () {
    //stuff here is scoped to this file only
})();
如果您正在保存一些数据,并且只需要将其保存在内存中,则可以将其挂起,而不保存到本地存储中。这将使整个应用程序都可以使用它

//on Page2.js
app.myCustomVariable = "some value";

//on Page3.js
if(app.myCustomVariable == "some value") ...

关于您的迫切需要:

  • 与另一个答案中提到的一样,您可以使用
    datachanged
    event
  • 关于共享变量:

  • 如果有一些变量希望保持应用程序的全局性,可以将它们放置在匿名函数之外,如Jeremy回答中所述。通常,这是在default.js中完成的。需要确保使用全局变量的脚本放在定义全局变量的脚本之后-在
    default.html
    中。通常-此类变量将指向singleton类。例如:我在我的一个应用程序中使用它来存储应用程序后端服务的authclient/serviceclient。这样-多个页面的视图模型不需要创建对象的实例或在WinJS命名空间下引用它
  • WinJS还有一个概念,它允许您组织函数和类。例如:

    WinJS.Namespace.define('Utils.Http',
    {
        stringifyParameters: function stringifyParameters(parameters)
        {
            var result = '';
            for (var parameterName in parameters)
            {
                result += encodeURIComponent(parameterName) + '=' + encodeURIComponent(parameters[parameterName]) + '&';
            }
    
            if (result.length > 0)
            {
                result = result.substr(0, result.length - 1);
            }
    
            return result;
        },
    }
    
    WinJS.Class.mix(MyViewModel,
        WinJS.Utilities.createEventProperties('customEvent'),
        WinJS.UI.DOMEventMixin);
    
    WinJS.Class.mix(MyViewModel,
        WinJS.Binding.mixin, 
        WinJS.Binding.expandProperties({ items: '' }));
    
  • 使用导航到页面时,第二个参数
    initialState
    作为页面的事件处理程序的
    options
    参数提供。除非这是应用程序数据或会话状态,否则建议将
    参数
    传递到页面。应用程序数据/会话状态需要单独处理,并且需要单独讨论。应用程序导航历史由winjs库保存;它可以确保如果应用程序在暂停后再次启动,则在导航时,选项将再次传递到页面。最好将
    options
    对象中的属性保持为简单的基本类型

  • 关于活动:

  • 通常,应用程序使用winjs库中的事件。这可以通过使用
    addEventListener
    注册事件处理程序或在元素上设置事件属性,如
    onclick
    等来实现。事件处理程序通常在页面的
    ready
    事件处理程序中注册
  • 如果您正在编写自己的自定义控件,或者有时在视图模型中编写自定义控件,则可能必须公开自定义事件,可以与您的班级混合使用。例如:

    WinJS.Namespace.define('Utils.Http',
    {
        stringifyParameters: function stringifyParameters(parameters)
        {
            var result = '';
            for (var parameterName in parameters)
            {
                result += encodeURIComponent(parameterName) + '=' + encodeURIComponent(parameters[parameterName]) + '&';
            }
    
            if (result.length > 0)
            {
                result = result.substr(0, result.length - 1);
            }
    
            return result;
        },
    }
    
    WinJS.Class.mix(MyViewModel,
        WinJS.Utilities.createEventProperties('customEvent'),
        WinJS.UI.DOMEventMixin);
    
    WinJS.Class.mix(MyViewModel,
        WinJS.Binding.mixin, 
        WinJS.Binding.expandProperties({ items: '' }));
    
  • 最常用的是绑定,以使视图模型可见。请参阅