Это потому, что this
ссылка внутри handleUpdateValueForCharacteristic
не то, что вы думаете. Вы можете узнать об этом подробно из You Dont Know Js
Придя к решению, существует множество подходов для решения этой проблемы, вам нужно исправить ссылку this
внутри handleUpdateValueForCharacteristic
[ 1114]
Одним из простых подходов является использование ARROW FUNCTION => . Функции стрелок сохраняют this
из того места, где определена функция.
var _receivedNb = 0
export default class App extends Component {
constructor(){
super()
}
componentDidMount() {
BleManager.start({showAlert: false});
this.handlerUpdate = bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', this.handleUpdateValueForCharacteristic );
}
handleUpdateValueForCharacteristic = (data) => {
_receivedNb = this.testFunc();
}
testFunc = () => {
var r = 2;
return r;
}
Второй подход использует .call, .bind или .apply . Вы можете прочитать о них позже, в Short Bind принимает this
в параметрах и возвращает жестко привязанную функцию, всегда ссылаясь на то, что было предоставлено внутри .bind
. Вы можете просто использовать handleUpdateValueForCharacteristic.bind(this)
и вызвать его. Лучший способ сделать это внутри constructor
.
var _receivedNb = 0
export default class App extends Component {
constructor(){
super()
this.newHandleUpdateValueForCharacteristic = handleUpdateValueForCharacteristic.bind(this)
}
componentDidMount() {
BleManager.start({showAlert: false});
this.handlerUpdate = bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', this.handleUpdateValueForCharacteristic );
}
handleUpdateValueForCharacteristic = (data) => {
_receivedNb = this.testFunc();
}
testFunc = () => {
var r = 2;
return r;
}
и используйте newHandleUpdateValueForCharacteristic
где угодно.
Вызов и применение аналогичны привязке с той лишь разницей, что она немедленно вызывает функцию с этой ссылкой и другими обязательными параметрами, передаваемыми в вызове и применении.
Вы не должны зеркально отражать массив модели в контроллере. Хотя я не был бы слишком обеспокоен привязкой непосредственно к массиву модели в очень простом случае, Вы могли также связать свои объекты пользовательского интерфейса с NSArrayController, который управляет массивом модели. Это обеспечило бы разделение между моделью и UI, и что еще более важно справилось бы с задачами как сортировка, выбор, добавление и удаление объектов, и так далее.
Я вижу, куда Вы происходите из, будучи обеспокоенным, что KVO и привязка нарушают "чистое" образцовое проектирование контроллера представления, но это не что-то, о чем необходимо волноваться. Даже при том, что уведомления KVO передают непосредственно представлению из модели, настраивая и изменяя соединение между представлением, и модель является все еще ответственностью контроллера (только в этом случае, это сделано через IB вместо этого). Например, Вы не хотели бы, чтобы объект модели получил ссылку на представление и связал себя с UI, который будет ответственностью контроллера.
Как другой пример чего-то для предотвращения рассмотрите, имела ли вместо этого модель массив "идентификаторов животных" вместо имен. Вместо того, чтобы создать метод для перевода идентификаторов животных в человекочитаемое животное называет в модели, Вы могли бы вместо этого хотеть создать преобразователь значения или средство форматирования, чтобы сделать преобразование. Это позволяет Вам поддерживать тот уровень разделения между моделью и представлением.
Следует иметь в виду также, что цель шаблонов разработки состоит в том, чтобы уменьшить сложность кодирования решения проблемы, чтобы никогда увеличить его. Вы будете видеть, что это - точно способ, которым работает Какао, даже при том, что это не могло бы всегда придерживаться самого строгого определения шаблона.