2014-01-07 1 views
0

Я создаю приложение с AngularJS и Slim PHP framework для бэкэнд, теперь я закончил свою первую форму и создал маршрут к шаблону для нее. Теперь моя проблема возникает, когда я хочу передать свои данные другому контроллеру, мне нужно передать данные другому контроллеру + представлению (шаблону), я не хочу загрязнять свое первое представление ни его контроллером, и поэтому я действительно хочу/нужно передать данные другому контроллеру, который я мог бы играть с моими данными и другой формой (вторая форма предназначена для расчета и других вещей) ... Таким образом, вы можете вызвать первый контроллер для предварительного сохранения, тогда как реальное сохранение данных (backend to DB) произойдет только во втором шаблоне контроллера +. Вот короткий моего 1-го зрения шаблона, который имеет вид:От AngularJS как передавать данные с контроллера + шаблон другому контроллеру + шаблон?

<form novalidate id="formAdd" name="formAdd" class="form-horizontal well col-md-7 col-md-pull-5" method="post"> 
    <fieldset> 
     <legend>Transaction form</legend> 

     <div class="form-group"> 
      <label for="symbol" class="col-sm-4 control-label">Symbol</label> 
      <div class="col-sm-5 symbols"> 
       <input type="text" name="symbol" class="form-control" ng-model="trsn.symbol" placeholder="symbol" required /> 
      </div> 
     </div>      
     <div class="form-group"> 
      <label for="accnt_id" class="col-sm-4 control-label">Account</label> 
      <div class="col-sm-5"> 
       <select id="accnt_id" name="accnt_id" ng-model="trsn.accnt_id" class="form-control" required> 
        <option value="">...</option> 
        <option ng-repeat="account in trsn.accounts" value="{{account.accnt_id}}">{{account.accnt_name}}</option> 
       </select> 
      </div> 
     </div> 
     <!-- ....etc, etc.... --> 

     <div class="form-actions col-sm-8 col-sm-offset-4"> 
      <button type="submit" name="save_btn" class="btn btn-primary" ng-disabled="formAdd.$invalid" ng-click="preSaveTrsn(trsn, formAdd)">Save transaction</button> 
      <button type="reset" class="btn btn-default">Cancel</button> 
     </div>   
    </fieldset> 
</form> 

то приложение с модулем и маршрутов:

var investingApp = angular.module('investingApp', ['ngSanitize','ngResource', 'ngRoute']) 
    .config(function($routeProvider, $locationProvider) { 
     $routeProvider.when('/new-trsn', 
      { 
       templateUrl: 'templates/StockTransaction.html', 
       controller: 'StockTransactionController' 
      }); 
     $routeProvider.when('/presave-trsn', 
      { 
       templateUrl: 'templates/PreSaveTransaction.html', 
       controller: 'PreSaveTrsnController' 
      });   
    }); 

Теперь внутри моего первого контроллера является функцией presave, который пуст так как я не знаю, что делать с ним, так что я могу отправить данные о транзакции на следующий контроллер + зрения:

investingApp.controller('StockTransactionController', 
    function TransactionController($scope, $http, $location, $compile, $timeout, transactionDataService, dateFilter) { 
     // define some default variables 
     $scope.trsn = {}; 
     $scope.trsn.symbol = ""; 
     ... 
     $scope.preSaveTrsn = function(trsn, formAdd) {   
      // what to put in here to transfer data to next controller???? 
     }; 

, а затем мой последний контроллер, у меня тоже ничего там еще, так как я могу» t recei какие-либо данные .... но в основном то, что я хочу ввести, - это данные транзакции (trsn), которые поступают от 1-го типа/контроллера.

investingApp.controller('PreSaveTrsnController', 
    function MenuController($scope, $http, trsn) { 
     console.debug(trsn); 
}); 

ли я поставить что-то внутри routeProvider каким-то образом? ... или мне нужно заполнить что-то особенное внутри функции preSaveTrsn внутри моего 1-го контроллера ??? Я очень смущен этим, потому что все примеры, которые я нахожу, предназначены для сохранения сразу в базе данных, но я не могу этого сделать, как я создаю свое приложение, это действительно должно быть на втором контроллере по нескольким причинам, t думаю, что я должен объяснить здесь .... Спасибо за любую помощь, оказанную :)

+0

Спасибо за оба ответа, здесь немного сложно найти победителя, так как я нахожу оба ответа действительными, так как я потратил время на то, чтобы попробовать оба, и поэтому я должен обогнать вас обоих :) Я отвечу на ответ Андрея простота, но Chandermani также будет хорошо, если мне нужно будет делать манипуляции с данными до перехода к следующему контроллеру, что также интересно. Так что спасибо снова !!! – ghiscoding

ответ

5

Вы можете создать легкий сервис - value

angular.module('investingApp').value('MySharedValue', {}); 

А затем вводят его в обоих контроллерах:

TransactionController($scope, $http, $location, $compile, $timeout, transactionDataService, dateFilter, MySharedValue) 

И просто присвоить ваши общие ценности его

 $scope.preSaveTrsn = function(trsn, formAdd) {   
      MySharedValue.trsn = trsn; 
     }; 
1

Есть 2 способа добиться этого. Во-первых, объявить объект модели на $ rootScope или в области, которая является родительской для обеих этих областей контроллера. Таким образом, данные становятся доступными, и изменения доступны для обоих контроллеров, независимо от того, кто их делает.

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

Как

angular.module("myApp",[]).factory('transactionService',[function(){ 
    var service={}; 
    var model={}; 
    service.preSaveTrsn = function(trsn, formAdd) {   
     //set model here 
    }; 
    service.getPreSaveTrsn=function() { 
     return model; 
    } 
    return service; 
}]); 
+0

Значит, вы имеете в виду удаление моей предварительной функции от моего первого контроллера и использование этой услуги? Это оно? Я просто хочу подтвердить, так как я тоже на кривой обучения Angular ... исправьте меня, если я ошибаюсь, это означает вызов 'preSaveTrsn()' в 1-м контроллере и вызов 'getPreSave()' с 2-й , это оно? Я считаю, что подход Андрея похож на ваш, а также – ghiscoding

+0

Да, все. И да, Андрей очень упростил его. – Chandermani

Смежные вопросы