如何将async数据从指令传递给控制器​​?

时间:2014-04-02 06:32:34

标签: angularjs angularjs-directive angularjs-controller uploadcare

我想将第三方api(uploadcare)编译为指令。

api将在async上传后返回数据信息然后我想对我的控制器中的返回数据做一些事情,但我不得不知道如何将返回数据从指令传递给控制器​​。以下是我的代码。

在js中

        link: function (scope, element, attrs) {
            //var fileEl  = document.getElementById('testing');
            var a = function() {

                var file    = uploadcare.fileFrom('event', {target: fileEl});
                file.done(function(fileInfo) {

                    //scope.$apply(attrs.directUpload)
                   //HERE IS MY PROBLEM.
                   //How can I get the fileInfo then pass and run it at attrs.directUpload

                }).fail(function(error, fileInfo) {

                }).progress(function(uploadInfo) {
                  //Show progress bar then update to node
                  console.log(uploadInfo);
                });
            };

            element.bind('change', function() {a()});
        }

in html

<input type="file" direct-upload="doSomething()">
控制器中的

$scope.doSomething = function() {alert(fileInfo)};

2 个答案:

答案 0 :(得分:8)

AngularJS允许在$parent上下文中使用指定值执行表达式,在您的情况下为doSomething()

以下是您需要做的事情:

  1. 在指令定义中,将directUpload标记为表达式:
  2. scope: {
        directUpload: "&"
    }
    
    1. done回调中,请致电:
    2. scope.directUpload({fileInfo: fileInfo})
      
      1. 更新标记:
      2. <input type="file" direct-upload="doSomething(fileInfo)">
        

        总结:scope.directUpload现在是一个回调,它使用specifeid值在属性内执行表达式。这样您就可以将任何内容传递给控制器​​doSomething

        阅读$compile docs以获取详细说明和示例。

        Example您可能会觉得有用:

        angular
        .module("app", [])
        .directive("onDone", function ($timeout) {
          function link (scope, el, attr) {
            $timeout(function () {
              scope.onDone({
                value: "something"
              });
            }, 3000)
          }
          return {
            link: link,
            scope: {
              onDone: "&"
            }
          }
        })
        .controller("ctrl", function ($scope) {
          $scope.doneValue = "nothing";
          $scope.done = function (value) {
            $scope.doneValue = value;
          };
        })
        
        <body ng-controller="ctrl">
          Waiting 3000ms
          <br>
        <div on-done="done(value)">
          Done: {{doneValue}}
        </div>
        </body>
        

答案 1 :(得分:0)

您可以使用=在指令内将对象传递到指令的范围,以进行双向数据绑定。这样,您可以对对象中的指令内的数据进行更新,并将其反映在控制器中的原始位置。在控制器中,您可以使用$ scope.watch来查看指令何时更改数据。

这样的东西

http://plnkr.co/edit/gQeGzkedu5kObsmFISoH

//代码在这里

angular.module("myApp",[]).controller("MyCtrl", function($scope){
  $scope.something = {value:"some string"}
}).directive("simpleDirective", function(){
  return {
    restrict:"E",
    scope:{someData:"="},
    template:"<button ng-click='changeData()'>this is something different</button>",
    link: function(scope, iElem, iAttrs){
      scope.changeData=function(){
        scope.someData.value = "something else";
      }
    }
  }
});