0

如何将对象传递给 Angular (Angular 1.4.8) 的&& 范围绑定指令?

我从文档中了解到,在回调函数中有一个需要命名参数的键解构,并且父作用域使用这些名称作为参数。这个 SO answer提供了一个有用的示例,说明了预期的&功能。当显式命名父控制器函数调用的参数时,我可以让它工作。

但是,我正在使用&通过工厂执行操作。父控制器对参数一无所知,只是将回调参数传递给 dataFactory,它需要基于操作的不同键/值。

一旦 promise 在工厂中解析,父作用域就会使用返回的数据进行更新。

因此,我需要一个具有n多个键/值对的对象,而不是命名参数,因为它会根据每个配置的操作而有所不同。这可能吗?

我见过的最接近的是将 $parse 注入到链接函数中,这不能回答我的问题,但这是我正在寻找的一种解决方法。这个悬而未决的问题听起来完全符合我的需要。

另外,我试图避免编码/解码 JSON,broadcast如果可能的话,我也想避免。为简洁起见,代码被精简。谢谢...

Relevant Child Directive Code

function featureAction(){
    return {
        scope: true,
        bindToController: {
            actionConfig: "=",
            actionName: "=",
            callAction: "&"
        },
        restrict: 'EA',
        controllerAs: "vm",
        link: updateButtonParams,
        controller: FeatureActionController
    };
}

Child handler on the DOM

 /***** navItem is from an ng-repeat, 
        which is where the variable configuration params come from *****/

ng-click="vm.takeAction(navItem)"

Relevant Child Controller

function FeatureActionController(modalService){
    var vm = this;
    vm.takeAction = takeAction;

    function _callAction(params){
        var obj = params || {};
        vm.callAction({params: obj});  // BROKEN HERE --> TRYING
                                       //TO SEND OBJ PARAMS
    }

    function executeOnUserConfirmation(func, config){
    return vm.userConfirmation().result.then(function(response){ func(response, config); }, logDismissal);
}

function generateTasks(resp, params){
    params.example_param_1 = vm.add_example_param_to_decorate_here;
    _callAction(params);
}

function takeAction(params){
    var func = generateTasks; 
    executeOnUserConfirmation(func, params);
}

Relevent Parent Controller

function callAction(params){
        // logs undefined -- works if I switch to naming params as strings
        console.log("INCOMING PARAMS FROM CHILD CONTROLLER", params) 
        executeAction(params);   
    }

    function executeAction(params){
        dataService.executeAction(params).then(function(data){ 
            updateRecordsDisplay(data); });
    }
4

1 回答 1

1

我认为下面的示例应该让您有足够的起点来弄清楚您的问题:

<!DOCTYPE html>
<html ng-app="myApp">
  <head>
    <meta charset="utf-8">
    <title>Angular Callback</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <script>
    var myApp = angular.module("myApp", []);

    myApp.controller('appController', function($scope) {
      $scope.var1 = 1;

      $scope.handleAction1 = function(params) {
        console.log('handleAction1 ------------------------------');
        console.log('params', params);
      }

      $scope.handleAction2 = function(params, val1) {
        console.log('handleAction2 ------------------------------');
        console.log('params', params);
        console.log('val1', val1);
      }

    });


    myApp.controller('innerController', innerController);
    innerController.$inject = ['$scope'];
    function innerController($scope) {
      $scope.doSomething = doSomething;

      function doSomething() {
        console.log('doSomething()');
        var obj = {a:1,b:2,c:3}; // <-- Build your params here
        $scope.callAction({val1: 1, params: obj});
      }
    }

    myApp.directive('inner', innerDirective );
    function innerDirective() {
      return {
        'restrict': 'E',
        'template': '{{label}}: <button ng-click="doSomething()">Do Something</button><br/>',
        'controller': 'innerController',
        'scope': {
          callAction: '&',
          label: '@'
        }
      };
    }
    </script>
  </head>
  <body ng-controller="appController">
    <inner label="One Param" call-action="handleAction1(params)"></inner>
    <inner label="Two Params" call-action="handleAction2(params, val)"></inner>
  </body>
</html>

appController我有两个函数将被inner指令调用。该指令期望外部控制器使用标签call-action上的属性传入这些函数。<inner>

当您单击inner指令中的按钮时,它会调用函数$scope.doSomethingThis,进而调用外部控制器函数handleAction1handleAction2. 它还传递一组参数val1params

$scope.callAction({val1: 1, params: obj});

在您的模板中,您指定要将哪些参数传递到外部控制器函数中:

call-action="handleAction1(params)"

或者

call-action="handleAction2(params, val)"

然后,Angular 使用这些参数名称来查看您调用时发送的对象$scope.callAction

如果您需要将其他参数传递给外部控制器函数,那么只需将 then 添加到调用中定义的对象中$scope.callAction。在您的情况下,您希望将更多内容放入传入的对象中:

var obj = {a:1,b:2,c:3}; // <-- Build your params here

使其适合您的需要,然后在您的外部控制器中使用params,它将是本段上方定义的对象的副本。

这不是你要问的,让我知道。

于 2017-11-07T18:09:20.510 回答