MVC и вопрос о лучших практиках привязки какао

Это потому, что 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 где угодно.

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

5
задан Quinn Taylor 30 June 2009 в 20:07
поделиться

1 ответ

Вы не должны зеркально отражать массив модели в контроллере. Хотя я не был бы слишком обеспокоен привязкой непосредственно к массиву модели в очень простом случае, Вы могли также связать свои объекты пользовательского интерфейса с NSArrayController, который управляет массивом модели. Это обеспечило бы разделение между моделью и UI, и что еще более важно справилось бы с задачами как сортировка, выбор, добавление и удаление объектов, и так далее.

Я вижу, куда Вы происходите из, будучи обеспокоенным, что KVO и привязка нарушают "чистое" образцовое проектирование контроллера представления, но это не что-то, о чем необходимо волноваться. Даже при том, что уведомления KVO передают непосредственно представлению из модели, настраивая и изменяя соединение между представлением, и модель является все еще ответственностью контроллера (только в этом случае, это сделано через IB вместо этого). Например, Вы не хотели бы, чтобы объект модели получил ссылку на представление и связал себя с UI, который будет ответственностью контроллера.

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

Следует иметь в виду также, что цель шаблонов разработки состоит в том, чтобы уменьшить сложность кодирования решения проблемы, чтобы никогда увеличить его. Вы будете видеть, что это - точно способ, которым работает Какао, даже при том, что это не могло бы всегда придерживаться самого строгого определения шаблона.

8
ответ дан 14 December 2019 в 04:49
поделиться