如何在指令和控制器之间以角度同步$ scope

时间:2015-08-18 17:29:56

标签: javascript angularjs

我有以下指令:

app.directive('fileInput', ['$parse', function ($parse) {
return {
    restrict: 'A',
    link: function (scope, element, attrs) {
        element.bind('change', function () {
            $parse(attrs.fileInput)
            .assign(scope, element[0].files)
            scope.$apply();
        });
        scope.$watch('files', function () {
            console.log(scope.files);
        });
    },
    controller: function ($scope, $element, $attrs) {
        $element.bind('change', function () {
            $parse($attrs.fileInput)
            .assign($scope, $element[0].files)

            $scope.$apply();
        });
        $scope.$watch('files', function () {
                console.log($scope.files);
            });
    }
}

修改 这是控制器:

controllers.controller('RegisterCtrl', ['$scope', '$routeParams', '$location', '$http', 'Restangular', 'ServiceRepository', 
function($scope, $routeParams, $location, $http, Restangular, ServiceRepository) 
{
   $scope.regService = function () {
        $scope.error = {};
        $scope.submitted = true;

        var fd = new FormData();
        fd.append("model", angular.toJson($scope.services));

        console.log($scope.files);
   }

}

这是视图文件

<input type="file" id="boarding-picture_where_sleeping" class="form-control" file-input="files" multiple>

提交表单时调用其他信息,regService()方法

当我调试$ scope.files时,它在控制台选项卡中可用。但在我的控制器中,它是未定义的

所以如何在指令和控制器之间进行同步 感谢

2 个答案:

答案 0 :(得分:1)

它现在正在运作。问题是由于我使用了2个嵌套指令:) 谢谢你们

答案 1 :(得分:0)

我会在指令定义中使用scopebindToController属性,例如this blog中的以下代码段:

app.directive('someDirective', function () {
  return {
    scope: {
      name: '='
    },
    controller: function () {
      this.name = 'Pascal';
    },
    controllerAs: 'ctrl',
    bindToController: true,
    template: '<div>{{ctrl.name}}</div>'
  };
});

它也需要使用controllerAs语法,但你应该使用它,因为它比在各处传递$ scope并处理原型继承要清楚得多。建议John Papa's AngularJS Style Guide