假设您有一个角度+茉莉花应用程序,您的控制器看起来像这样:
app.controller('MyController', function($scope) {
$scope.myFunc = function() {
$scope.myArray = [];
// after some operations here
myArray.push(new_obj);
}
$scope.someOtherArray = [];
}
此外,我有一个由myArray
中的每个元素触发的自定义指令。像这样:
app.directive('myDirective', function() {
return {
// directive goes here
// and some definitions
link: function(scope, element, attrs) {
scope.someOtherArray.push(other_obj)
}
}
}
最后,在HTML中:
<div myDirective ng-repeat="obj in myArray"></div>
因此,每次向myArray
添加元素时,都会创建另一个指令元素并修改$scope.someOtherArray
。这很好用,但我发现myFunc()
和控制器的属性很难测试:
controller = $controller('MyController', { $scope: mockScope });
SpyOn(mockScope, 'myFunc').and.callThrough();
// expectGET and expectPOST here.
mockScope.myFunc();
但是,在运行该代码之后,有一些对象(依赖于自定义指令)在调用mockScope.myFunc();
后没有更新(例如someOtherArray
)。显然,我需要手动编译自定义指令:
var element = '<div myDirective ng-repeat="obj in myArray"></div>';
element = $compile(element)(mockScope);
嗯,这看起来有点尴尬。我希望在运行mockScope.myFunc()
之后,每个副作用都会自动发生。否则,我需要考虑流程中涉及的每个指令并编译它们。
有更好的方法吗?