Одно из моих любимых применений для указателей функций - это дешевые и простые итераторы -
#include <stdio.h>
#define MAX_COLORS 256
typedef struct {
char* name;
int red;
int green;
int blue;
} Color;
Color Colors[MAX_COLORS];
void eachColor (void (*fp)(Color *c)) {
int i;
for (i=0; i<MAX_COLORS; i++)
(*fp)(&Colors[i]);
}
void printColor(Color* c) {
if (c->name)
printf("%s = %i,%i,%i\n", c->name, c->red, c->green, c->blue);
}
int main() {
Colors[0].name="red";
Colors[0].red=255;
Colors[1].name="blue";
Colors[1].blue=255;
Colors[2].name="black";
eachColor(printColor);
}
здесь приведен пример
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<script
src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"
id="sap-ui-bootstrap"
data-sap-ui-theme="sap_bluecrystal"
data-sap-ui-xx-bindingSyntax="complex"
data-sap-ui-libs="sap.m"></script>
<style type="text/css">
.sapMObjLTitle {
cursor: pointer;
}
</style>
<!-- XML-based view definition -->
<script id="oView" type="sapui5/xmlview">
<mvc:View height="100%" controllerName="myView.Template"
xmlns="sap.m"
xmlns:core="sap.ui.core"
xmlns:mvc="sap.ui.core.mvc">
<Select change="onDataChange" items="{ path: 'project>/data', templateShareable: false}">
<core:Item key="{project>Id}" text="{project>Parameter}"/>
</Select>
</mvc:View>
</script>
</head>
<body class="sapUiBody">
<div id='content'></div>
</body>
</html>
sap.ui.define([
'jquery.sap.global',
'sap/ui/core/mvc/Controller',
'sap/ui/model/json/JSONModel'
], function(jQuery, Controller, JSONModel) {
var ListController = Controller.extend("myView.Template", {
onInit: function(oEvent) {
var oView = this.getView();
oView.setModel(new JSONModel({
data: [{
Id: "1",
Parameter: "One"
}, {
Id: "2",
Parameter: "Two"
}]
}), "project");
},
onDataChange: function() {
alert("changed")
}
});
return ListController;
});
// Instantiate the View and display
var oView = sap.ui.xmlview({
viewContent: jQuery('#oView').html()
});
oView.placeAt('content');
https://jsbin.com/zufurav/edit?html,js,output
Примечание: атрибут изменения в вашем XML неверен
Если я хорошо помню JS Views, я думаю, что это так:
<Select items="{ path: 'project>/data/', events: {change:'onDataChange'}, templateShareable: false}">
Это для прослушивания событий «изменения» модели.
Если вы хотите прослушать событие «change» в элементе управления Select, это когда пользователь выбирает другое значение в раскрывающемся списке, это примерно так:
<Select items="{ path: 'project>/data/', templateShareable: false}" change="onDataChange">
EDIT: использование события «modelContextChange».
<Select items="{ path: 'project>/data/', templateShareable: false}" modelContextChange="onDataChange">
event.getSource()
и контроллер как this
. С attachChange это легко изменить, потому что я могу передать Select как это, но как это сделать через XML? Или, может быть, есть другой способ доступа к Select внутри onDataChange?
– taavilooke
13 July 2018 в 11:27
event.getSource()
. Затем у вас есть «изменение». событие, инициированное привязкой. При этом вы склонны к изменениям в модели по определенному пути, поэтому у вас есть ссылка на модель, но не на контроль. У этого последнего есть преимущество / недостаток увольнения каждый раз, когда значение изменяется в этом узле вашей модели, не имеет значения, изменено ли оно в элементе управления Select или нет
– Rafael López Martínez
13 July 2018 в 11:52
Мне удалось получить событие смены привязки с this
, установленным на тот элемент, который мне нужен, добавив modelContextChange в элемент и обработав прикрепление события изменения к привязке в нем. Вот код из контроллера вида:
modelContextChange: function(oEvent) {
var oElement = oEvent.getSource();
var binding = oElement.getBinding("items");
if (binding) {
//Binding change event could already be attached, detach it first, if it's there
binding.detachChange(this.onBindingChange, oSelect);
binding.attachChange(this.onBindingChange, oSelect);
// Beacause I used this inside a sap.ui.table.Treetable,
// in some cases binding changes occur without the binding change event firing.
// Manually fire the binding change just in case
// YMMV
binding.refresh(true);
}
},
onBindingChange: function() {
//The code that needs to run at binding change
//"this" is set to the correct element
//I specifically needed to add one element in front of other items in a sap.m.Select
var items = this.removeAllItems();
this.addItem(new sap.ui.core.Item({
key: 0,
text: "< Inherit >"
}));
items.forEach(function(item) {
this.addItem(item);
}, this);
}