Giter Site home page Giter Site logo

Comments (5)

danielgeri avatar danielgeri commented on June 16, 2024 10

ah i think i misunderstood your question. To rephrase, you have a child component that is responsible for taking a picture that needs to be triggered by the parent component. Is this correct? If so, one way of doing it is the following:
camera.component.js

class CameraController {
  constructor(CameraService) {
    this._cameraService = CameraService;
  }

  $onChanges(changes) {
    if (changes.buttonPressed.currentValue) {
      this._takePicture();
    }
  }

  _takePicture() {
    this._cameraService
      .takePicture()
      .then(() => /* some code */)
      .catch(err => /* handle err */)
      .finally(() => this.resetButton());
  }

}

export default Camera {
  template: require('./camera.html'),
  controller: CameraController,
  controllerAs: 'vm',
  bindings: {
    buttonPressed: '<',
    resetButton: '&'
  }
};

parent.component.js

class ParentController {
  takePicture() {
    this.buttonPressed = true;
  }

  resetButton() {
    this.buttonPressed = false;
  }
}

export default Parent {
  template: require('./parent.html'),
  controller: ParentController,
  controllerAs: 'vm'
};

parent.html

<div>
  <camera-component
    button-pressed="vm.buttonPressed"
    reset-button="vm.resetButton()"
  />
  <button ng-click="vm.takePicture()">Say Cheeze</button>
</div>

also - confused on why the trigger can't exist within the child component

from angularjs-styleguide.

fredyrsam avatar fredyrsam commented on June 16, 2024

I have the same issue with a child component

from angularjs-styleguide.

danielgeri avatar danielgeri commented on June 16, 2024

I'm a little confused on the goal there, but you could leverage one-way bindings to traverse data into the child component, without mutating the parent scope.

from angularjs-styleguide.

CarlosOV avatar CarlosOV commented on June 16, 2024

can you give me an example how to solve it using one-way bindings?

from angularjs-styleguide.

 avatar commented on June 16, 2024

In order to decouple the parent from child further, would this approach be considered in good style?

class CameraController {
  constructor(CameraService) {
    this._cameraService = CameraService;
  }

  $onChanges(changes) {
    if (changes.buttonPressed.currentValue) {
      this._takePicture();
    }
  }

  _takePicture() {
    this._cameraService
      .takePicture()
      .then(() => /* some code */)
      .catch(err => /* handle err */);
  }
}

export default Camera {
  template: require('./camera.html'),
  controller: CameraController,
  controllerAs: 'vm',
  bindings: {
    buttonPressed: '<',
  }
};

parent.component.js

class ParentController {
  constructor($timeout) {
    this.$timeout = $timeout;
    this._buttonPressed = false;
  }

  get buttonPressed() {
    return _buttonPressed;
  }

  set buttonPressed(value) {
    const { $timeout } = this;
		
    $timeout(() => {
      this._buttonPressed = value;

      if (this._buttonPressed) {
        $timeout(() => {
          this._buttonPressed = false;
        });
      }
    });
  }
	
  takePicture() {
    this.buttonPressed = true;
  }
}

ParentController.$inject = ['$timeout'];

export default Parent {
  template: require('./parent.html'),
  controller: ParentController,
  controllerAs: 'vm'
};

parent.html

<div>
  <camera-component button-pressed="vm.buttonPressed" />
  <button ng-click="vm.takePicture()">Say Cheeze</button>
</div>

Ultimately, we leave the resetting of the buttonPressed property to the parent controller. This still triggers the change in the child and now the child does not care about manipulating the state of its parent.

from angularjs-styleguide.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.