2013-08-05 3 views
2

Я не уверен, какой должен быть правильный заголовок/заголовок для этого вопроса. Я новичок в WinJS и прихожу из .NET webform и winclient background.WinJS переменная/объект scope, настройки и события?

Вот мой сценарий. У меня есть приложение WinJS для навигации. Моя структура:

  • default.html
    • (навигация контроллер)
    • (настройки Выпадающая)
  • страницы/home.html
  • страницы/Page2.html

Таким образом, в верхней части файла default.js задаются следующие переменные:

var app = WinJS.Application; 
var activation = Windows.ApplicationModel.Activation; 
var nav = WinJS.Navigation; 

Похоже, что я не могу использовать эти переменные где-либо внутри всплывающих окон моих настроек или любой из моих страниц: готовые функции. Они привязаны только к default.js?

В этом же смысле существуют ли ресурсы на межсетевых экранах (ссылках), которые показывают, как правильно обмениваться переменными, событиями и данными между каждой моей «страницей»?

Сценарий, который мне нужно немедленно преодолеть, - это настройки. В моих настройках Выпадающие, я прочитал и позволить пользователю дополнительно задать следующий параметр приложения:

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

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

Я хочу, чтобы реагировать на это событие в любом моем файле default.js или даже один из моих страниц навигации, но я дон «Не знаю, где« слушать ». Моя кишка - это послушать событие afterhide, но как я могу отобразить его на странице, откуда я хочу слушать?

+0

до сих пор это была большая помощь, насколько объем: http://www.codefoster.com/post/2012/03/16/All-About-Scope.aspx Я все еще хотел бы найти правильный способ поднять события и «послушать» их, чтобы ответить. – Bryan

ответ

1

Вот что я в конечном итоге делает что любопытное сочетание всех ответов данной:

  • Создано ViewModel.Settings.js файл:

    (function() { 
        "use strict"; 
    
        WinJS.Namespace.define("ViewModel", { 
         Setting: WinJS.Binding.as({ 
          Name: '', 
          Value: '' 
         }), 
         SettingsList: new WinJS.Binding.List(), 
        }); 
    
    })(); 
    
  • Добавлен этот файл на мою страницу default.html (страница контейнера для навигации)

    <script src="/js/VMs/ViewModel.Settings.js"></script> 
    
  • Добавьте следующие параметры для настройки по умолчанию и начать «слушать» для изменения

    //add some fake settings (defaults on app load) 
    ViewModel.SettingsList.push({ 
        Name: "favorite-color", 
        Value: "red" 
    }); 
    
    // listen for events 
    var vm = ViewModel.SettingsList; 
    
    vm.oniteminserted = function (e) { 
        console.log("item added"); 
    } 
    vm.onitemmutated = function (e) { 
        console.log("item mutated"); 
    } 
    vm.onitemchanged = function (e) { 
        console.log("item changed"); 
    } 
    vm.onitemremoved = function (e) { 
        console.log("item removed"); 
    } 
    

Затем в моем приложении (страницы) или мою страницу настроек, я могу вызвать настройки события уволят:

// thie fires the oniteminserted 
    ViewModel.SettingsList.push({ 
     Name: "favorite-sport", 
     Value: "Baseball" 
    }); 

    // this fires the itemmutated event 
    ViewModel.SettingsList.getAt(0).Value = "yellow"; 
    ViewModel.SettingsList.notifyMutated(0); 

    // this fires the itemchanged event 
    ViewModel.SettingsList.setAt(0, { 
     Name: "favorite-color", 
     Value: "blue" 
    }); 

    // this fires the itemremoved event 
    ViewModel.SettingsList.pop(); // removes the last item 
0

При изменении данных, которые необходимо обновить в реальном времени, звоните applicationData.signalDataChanged(). Затем в местах, которые заботятся о получении уведомлений об изменениях, прослушайте datachanged на объекте applicationData. Это также событие, которое возникает, когда параметры роуминга синхронизируются между компьютерами.

Я обнаружил, что много раз, мгновенное уведомление (поднятое событие) не является необходимым. Я просто запрашиваю настройку снова, когда это значение необходимо (например, в ready).

2

Bryan. codefoster здесь. При перемещении линии вы упомянули ...

var app = WinJS.Application; 
var activation = Windows.ApplicationModel.Activation; 
var nav = WinJS.Navigation; 

... и из непосредственной функции, они будут находиться в глобальном масштабе и вы будете иметь доступ к ним во всем мире. Это одна из первых вещей, которые я делаю в своих приложениях. Вы услышите предупреждения об использовании глобальной области, но то, что люди пытаются избежать, - это шаблон удаления всего в глобальном масштабе. Пока вы контролируете то, что вы там вкладываете, все в порядке.

Поэтому поставьте их перед началом непосредственной функции по умолчанию. 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") ... 
1

Что касается вашей непосредственной потребности:

  1. как упоминалось в другой ответ, вы можете использовать datachanged событие.

С уважением обмена переменными:

  1. Если есть переменные, которые вы хотели бы сохранить глобальный для приложения, они могут быть размещены за пределами анонимной функции, как упомянуто в ответ Джереми. Как правило, это делается в default.js. Необходимо убедиться, что сценарии, использующие глобальные переменные, размещены после сценария, определяющего глобальную переменную, - в default.html. Обычно - такая переменная укажет на одноэлементный класс. Например: я использую его в одном из моих приложений для хранения authclient/serviceclient для бэкэнд-сервиса для приложения. Таким образом, модели просмотра нескольких страниц не должны создавать экземпляр объекта или ссылаться на него в пространстве имен WinJS.
  2. WinJS также имеет концепцию Namespace, которая позволяет организовывать ваши функции и классы. Пример:

    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; 
        }, 
    } 
    
  3. При переходе на страницу с помощью WinJS.Navigation.navigate, второй аргумент initialState доступен в качестве параметра options в обработчик события ready для страницы. Это было бы рекомендовано, чтобы передать arguments на страницу, если это не данные приложения или состояние сеанса. Данные приложения/состояние сеанса необходимо обрабатывать отдельно и для самостоятельного обсуждения необходимо отдельное обсуждение. История навигации приложения сохраняется в библиотеке winjs; он гарантирует, что если приложение будет запущено снова после приостановки - параметры будут снова переданы на страницу при навигации. Хорошо сохранять свойства в объекте options как простые примитивные типы.

Приветы события:

  1. Как правило, приложения потребляют события из winjs библиотеки. Это можно сделать, зарегистрировав обработчик событий с помощью addEventListener или установив для этого свойства события, например onclick и т. Д.. Обработчики событий обычно регистрируются в обработчике событий ready для этой страницы.
  2. Если вы пишете собственный пользовательский элемент управления или иногда в своей модели просмотра, возможно, вам придется подвергать пользовательские события. Winjs.UI.DOMEventMixin, WinJS.Utilities.createEventProperties можно смешивать с вашим классом, используя WinJS.Class.mix. Пример:

    WinJS.Class.mix(MyViewModel, 
        WinJS.Utilities.createEventProperties('customEvent'), 
        WinJS.UI.DOMEventMixin); 
    
  3. Наиболее часто используемый является обязательным для того, чтобы модель вашего вида наблюдалась. Для получения дополнительной информации см. Соответствующие образцы и документацию api.Пример:

    WinJS.Class.mix(MyViewModel, 
        WinJS.Binding.mixin, 
        WinJS.Binding.expandProperties({ items: '' })); 
    
+0

Именно это я и сделал. codefoster и daughtkom очень помогли. В принципе, сочетание всех привлекло меня к моему ответу. Я опубликую ниже, чтобы кто-нибудь еще пришел посмотреть, как это работает из конца в конец. – Bryan