3

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

api将在异步上传后返回数据信息,然后我想对控制器中的返回数据做一些事情,但我必须知道如何将返回数据从指令传递到控制器。下面是我的代码。

在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()});
        }

在 HTML 中

<input type="file" direct-upload="doSomething()">

在控制器中

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

2 回答 2

8

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

这是您需要执行的操作:

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

总结一下:scope.directUpload现在是一个回调,它使用特定值执行属性内部的表达式。这样你就可以将任何东西传递给控制器​​的doSomething.

阅读$compile 文档以获得详细的解释和示例。

您可能会发现有用的示例:

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>
于 2014-04-02T07:02:06.307 回答
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";
      }
    }
  }
});
于 2014-04-02T06:45:12.733 回答