如何将表单提交事件传播到自定义指令的父级?

23 浏览
0 Comments

如何将表单提交事件传播到自定义指令的父级?

我有一个简单的AngularJS项目,用户输入数据后,我会根据这些数据生成一个图表。我正在尝试找出如何组织代码,使其符合MVC设计模式。特别是,我在弄清楚如何将表单的提交事件传播到自定义指令的父级时遇到了问题。我正在寻找某种回调机制。

看起来有几种选择,但我还没有让它们中的任何一种工作。我考虑使用自定义指令、ui-Router和服务(如AngularJS:如何在控制器之间传递变量?)。

到目前为止,我一直在尝试使自定义指令的方法起作用。我有一个自定义指令,它是一个表单,当提交时应该将其输入传递给另一个自定义指令。我有三个控制器:一个用于主应用程序的NavigationController,一个用于输入的InputController,它与指令绑定,一个用于输出的OutputController,它与指令绑定。

我认为NavigationController应该知道如何从InputController中提取输入数据并将其传递给OutputController。而InputController和OutputController应该保持不可知,以便可以重用它们。

我猜我已经弄清楚了除了流程控制以外的一切。输入表单包含

,所以即使我希望它保持不可知,它也负责触发响应用户提交的输入的操作。然而,处理这个操作的代码应该在OutputController中,InputController不应该知道它。

我如何使NavigationController响应包含在自定义指令中的提交事件,其控制器是InputController?然后,NavigationController如何从InputController实例中提取数据并调用OutputController中包含的代码,以渲染图表(即下面代码中的renderChart())?

下面的代码也可以在Plunker上找到:http://plnkr.co/edit/wm4suXMcSUE6obYFk3hp?p=preview

index.html

a3j.js

(function(){

var app = angular.module('a3d', ['input-form', 'index-chart']);

app.controller('NavigationController', function(){

this.inputMode = true;

this.shouldShowInputForm = function(){

return this.inputMode;

};

this.shouldShowOutputChart = function(){

return !this.inputMode;

};

this.flipMode = function(){

this.inputMode = !this.inputMode;

}

});

})();

input-form.html

ng-submit="inputForm.$valid && ????" novalidate>

inputForm.js

(function(){

var app = angular.module('input-form', [ ]);

app.directive('inputForm', function(){

return {

restrict: 'E',

templateUrl: 'input-form.html',

};

});

app.controller('InputController', ['$window', '$log', function($window, $log, appData){

// ...

}]);

})();

index-chart.html

indexChart.js

(function(){

var app = angular.module('index-chart', [ ]);

app.directive('indexChart', function(){

return {

restrict: 'E',

templateUrl: 'index-chart.html'

};

});

app.controller('OutputController', ['$window', '$log', function($window, $log, appData){

this.renderChart = function(){

// This is where the chart should get rendered

};

}]);

})();

0
0 Comments

问题的出现原因:

在这段代码中,有一个父级指令(NavigationController)和两个子级指令(inputForm和indexChart)。父级指令将一个值传递给这两个子级指令,并且当输入表单提交时,子级指令将这个值赋给自己的$scope.data属性。问题是,当这个值在子级指令中改变时,父级指令并不会感知到这个改变。

解决方法:

为了解决这个问题,可以使用$watch方法在子级指令中监听$scope.data的改变,并在发生改变时执行相应的操作。在这个例子中,子级指令indexChart使用了$watch方法来监听$scope.data的改变,并将新值打印到控制台上。

另一个需要注意的点是,每个指令都有一个隔离作用域,并且都有一个名为data的属性。父级指令NavigationController将同一个值传递给这两个子级指令。这样,当子级指令的$scope.data属性改变时,父级指令也能感知到这个改变。

通过在子级指令中监听父级指令传递的值的改变,并在发生改变时执行相应的操作,可以将表单提交事件传播到父级指令。这样,父级指令就能感知到子级指令的变化,并做出相应的反应。

0