Ваш компонент должен реагировать на изменения в базовых данных. Таким образом, вы можете сделать что-то вроде этого:
getSchedules(emps) {
return emps.map(employee => <SomeEmployeeRenderingComponent emp={employee} /> );
}
render() {
return (
<div>{this.getSchedules(this.props.employees).bind(this)}</div>
)
}
и mapstatetoprops становится:
function mapStateToProps(state) {
const rota = {
id: null,
date: moment(),
notes: null,
events: [null, null, null, null, null, null, null],
published: null,
employees: state.firestore.ordered.employees
};
return rota
}
Я не мог подписаться на текущие изменения окна, но можно попросить у доступности API текущего приложения и текущих приложений большая часть активного окна.
Предположите, что у Вас есть класс под названием CurrentAppData со следующими данными:
@interface CurrentAppData : NSObject {
NSString* _title;
AXUIElementRef _systemWide;
AXUIElementRef _app;
AXUIElementRef _window;
}
Код для нахождения текущего применения выглядит примерно так:
-(void) updateCurrentApplication {
// get the currently active application
_app = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedApplicationAttribute
ofUIElement:_systemWide];
// Get the window that has focus for this application
_window = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedWindowAttribute
ofUIElement:_app];
NSString* appName = [CurrentAppData descriptionOfValue:_window
beingVerbose:TRUE];
[self setTitle:appName];
}
В этом примере _systemWide переменная инициализируется в классах init функция как: _system = AXUIElementCreateSystemWide ();
Функция класса valueOfExistingAttribute похожа на это:
// -------------------------------------------------------------------------------
// valueOfExistingAttribute:attribute:element
//
// Given a uiElement and its attribute, return the value of an accessibility
// object's attribute.
// -------------------------------------------------------------------------------
+ (id)valueOfExistingAttribute:(CFStringRef)attribute ofUIElement:(AXUIElementRef)element
{
id result = nil;
NSArray *attrNames;
if (AXUIElementCopyAttributeNames(element, (CFArrayRef *)&attrNames) == kAXErrorSuccess)
{
if ( [attrNames indexOfObject:(NSString *)attribute] != NSNotFound
&&
AXUIElementCopyAttributeValue(element, attribute, (CFTypeRef *)&result) == kAXErrorSuccess
)
{
[result autorelease];
}
[attrNames release];
}
return result;
}
Предыдущая функция была взята от примера Apple UIElementInspector, который является также большим ресурсом для приобретения знаний о Доступности API.
В Mac OS X приложения и окна являются абсолютно отдельными вещами с приложениями, содержащими окна; они не formerly-the-same-thing как в Microsoft Windows. Необходимо обнаружить активацию и деактивацию каждого приложения.
Вы сделаете это путем наблюдения для kAXApplicationActivatedNotification
и kAXApplicationDeactivatedNotification
. Объект этих уведомлений является приложением, активируемым и деактивированным. Необходимо будет также обнаружить запуск приложений и выход; можно сделать это использование Диспетчера процессов или NSWorkspace. Оба из тех API могут дать Вам идентификатор процесса, который можно использовать для создания объекта AXApplication.
Что относительно NSAccessibilityFocusedUIElementChangedNotification?