AngularJS правильно распределяет данные между вложенными компонентами - PullRequest
0 голосов
/ 03 июля 2018

Я хочу встроить вложенный компонент в страницу.

(страница на самом деле является контроллером, к которому можно обратиться через службу $routeProvider)

И я хочу перенести данные из основного компонента в его дочерний компонент и наоборот - чтобы все компоненты на странице и сама страница общались друг с другом в полной привязке данных.

Я успешно отправляю данные от родителя к потомку с определенными атрибутами привязок, однако я не получаю способ передать данные от родителя к родителю.

// lobby.js - the main page.
// we can reach this page via browser by the $routeProvider service

app.config(($routeProvider) => {
  $routeProvider
  .when("/", {
    templateUrl : "screens/lobby/lobby.html"
  })
});

app.controller("lobby", ($scope, datepickerService) => {

  $scope.title = "Welcome to Lobby screen!";

  $scope.order = {};

  $scope.send = function() {
    console.log($scope.order);
  };

});

Lobby.html

<!-- This is lobby.html file -->
<!-- Which is the html template of the main page (lobby.js) -->

<link rel="stylesheet" href="screens/lobby/lobby.css">

<div class="lobby" ng-controller="lobby">

  <date-picker type="default" model="startDate"></date-picker>
  <date-picker type="default" model="endDate"></date-picker>

  <button type="button" name="button" ng-click="send()">Send</button>

</div>

Теперь, как вы можете видеть, в файлеobby.html у меня есть вложенный компонент <date-picker></date-picker>. От родительского я передаю этому дочернему компоненту два атрибута: type и model.

Теперь давайте посмотрим на функциональность этого компонента:

// datepicker.js component (actually defined as a directive)
// Initializing a datepicker plugin from jQuery UI Lib.

app.directive("datePicker", (datepickerService) => {
  return {
    templateUrl: "/shared/datepicker/datepicker.html",
    scope: {
      model: "@",
      type: "@",
    },
    link: function(scope, elements, attrs) {

      $(function() {
        setTimeout(function () {
          $("." + scope.model).datepicker({
            onSelect: function(value) {
              value = datepickerService.correct(value);
              $("." + scope.model).val(value);
              console.log(value);
            }
          });
        }, 200);
      });

    }
  }
});

datepicker.html

<!-- datepicker.html the datepicker html template -->
<!-- Successfuly getting the datepicker to be loaded and work -->

<box ng-show="type=='default'">
  <input type="text" class="{{model}}" readonly>
</box>

Теперь проблема: обратите внимание:

// lobby.js
$scope.send = function() {
  console.log($scope.order);
};

в файлеobby.js.

Мне нужно это для отправки фактических startDate и endDate на удаленный сервер. Однако я не могу получить доступ к этим данным! $scope.order остается пустым.

Я пытался использовать компоненты вместо директив, которые я пробовал ng-include Я перепробовал больше вещей, которыми я не буду вас беспокоить, так как я потратил на это более 3 дней.

Как я могу работать с вложенными компонентами, чтобы все данные передавались через каждый из них, включая главную страницу AngularJS, для создания масштабируемого современного приложения?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Для отправки данных от родителя к ребенку angular предоставляет метод $broadcast(), а для отправки данных от ребенка к родителю - метод $emit().

Дополнительная информация: http://www.binaryintellect.net/articles/5d8be0b6-e294-457e-82b0-ba7cc10cae0e.aspx

0 голосов
/ 03 июля 2018

Я думаю, что вы должны ссылаться на ваши startDate и endDate в вашем объекте заказа. Прямо сейчас кажется, что вы сохраняете их прямо в вашей области видимости. Попробуйте это, чтобы проверить:

console.log($scope.order, $scope.startDate, $scope.endDate);

добавьте " order. " перед вашими объектами в атрибуте model .

<!-- This is lobby.html file -->
<!-- Which is the html template of the main page (lobby.js) -->

<link rel="stylesheet" href="screens/lobby/lobby.css">

<div class="lobby" ng-controller="lobby">

   <date-picker type="default" model="order.startDate"></date-picker>
   <date-picker type="default" model="order.endDate"></date-picker>

   <button type="button" name="button" ng-click="send()">Send</button>

</div>

Кроме того, вам также может понадобиться изменить определение атрибута вашего компонента, чтобы использовать двунаправленную привязку. Используйте « = » вместо « @ ». @ представляет только копию значения при передаче в компонент, но не сохраняется обратно в исходный объект.

...
scope: {
  model: "=",
  type: "@",
},
...

Обновление

Пожалуйста, найдите мой рабочий Plunker здесь https://embed.plnkr.co/2TVbcplXIJ01BMJFQbgv/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...