Можно ли добавить событие изменения привязки к компоненту в виде XML?

Одно из моих любимых применений для указателей функций - это дешевые и простые итераторы -

#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);
}
0
задан taavilooke 13 July 2018 в 09:12
поделиться

3 ответа

здесь приведен пример

<!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 неверен

0
ответ дан D. Seah 17 August 2018 в 13:17
поделиться

Если я хорошо помню 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">
1
ответ дан Rafael López Martínez 17 August 2018 в 13:17
поделиться
  • 1
    Спасибо, свойство events , похоже, делает именно то, что я искал, но все еще остается одна вещь. Мне нужно передать сам элемент Select в onDataChange. Как бы то ни было, обработчик события получает только привязку как event.getSource() и контроллер как this. С attachChange это легко изменить, потому что я могу передать Select как это, но как это сделать через XML? Или, может быть, есть другой способ доступа к Select внутри onDataChange? – taavilooke 13 July 2018 в 11:27
  • 2
    Я думаю, вы смешиваете вещи. Есть 2 "изменения" Мероприятия. Один из них - это событие, запущенное элементом управления, всякий раз, когда выбор изменился. При этом у вас есть ссылка на элемент управления с помощью event.getSource(). Затем у вас есть «изменение». событие, инициированное привязкой. При этом вы склонны к изменениям в модели по определенному пути, поэтому у вас есть ссылка на модель, но не на контроль. У этого последнего есть преимущество / недостаток увольнения каждый раз, когда значение изменяется в этом узле вашей модели, не имеет значения, изменено ли оно в элементе управления Select или нет – Rafael López Martínez 13 July 2018 в 11:52
  • 3
    Если вы хотите посмотреть изменения в элементе управления, вам необходимо прослушать «изменение», событие в контроле, как я упомянул во втором фрагменте моего ответа – Rafael López Martínez 13 July 2018 в 11:53
  • 4
    Позвольте мне объяснить: то, что я пытаюсь сделать в конце, - привязать элементы Select к списку записей в JSONModel ( project & gt; / Parameters / ), но есть еще одна опция ( называемый Inherit ) перед всеми другими элементами. Я попытался создать отдельную модель для элементов select, но это создает проблему сохранения двух в синхронизации. Поэтому я ищу, что, когда связанный список изменен, я мог поймать это событие и добавить Inherited обратно из всех других записей. – taavilooke 13 July 2018 в 13:54
  • 5
    Мне удается создать вид , добавив в событие modelContextChange прослушиватель событий изменения привязки (см. Этот фрагмент ). В основном это работает, но я должен проверить несколько вещей, потому что modelContextChange может быть запущен несколько раз до и после привязки. Поэтому я ищу способ привязать это событие изменения привязки непосредственно в XML, поэтому я могу избавиться от всех этих странных проверок, которые мне нужно сделать. – taavilooke 13 July 2018 в 14:05

Мне удалось получить событие смены привязки с 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);
}

0
ответ дан taavilooke 17 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: