回答你的问题
由于标准原型继承规则适用,因此将指令中数组的更改反映在原始文件中应该可以工作。当您执行此操作时,您的指令中的含义(即使它创建了一个新范围):
current_element_list[0] = 'new value';
这种变化应该反映在控制器的$scope.project.elements
变量中。
现在,如果您的指令没有创建新范围,则scope
传递给指令的变量应该与$scope
包含控制器的变量相同,这意味着您应该能够随意更改该范围内的任何内容。因此,如果您在指令中执行此操作:
scope.project.elements = ['new value'];
这种变化也应该反映在控制器的$scope.project.elements
变量中。
如果您的指令创建了一个隔离范围,那么您不应该使用它scope.$apply($(this).attr('sortable-model'))
来获取属性的评估值。相反,您将使用:
scope : {
current_element_list : '=sortableModel'
}
这会为 sortableModel 的评估值创建一个双向数据绑定,并且现在可以通过scope.current_element_list
.
对代码的建议改进
关于这条线:
var current_element_list = scope.$apply($(this).attr('sortable-model'));
如果您只是想“获取”数组,则不需要 use $apply
,而是使用$eval
. 该$apply
函数主要用于将一个人带回 AngularJS 上下文,触发摘要循环并检查所有模型是否平衡并且所有更改都被考虑在内。$eval
($apply
函数调用)简单地评估给定范围内的给定表达式。
此外,使用指令,您永远不必使用 jQuery 来获取属性名称或值,甚至是元素本身。链接函数获得了 4 个参数,其中一个是具有所述元素的属性和属性值的对象。指令的控制器也可以注入 $attrs 服务,这将返回相同的内容。(阅读指令文档)
这是上面的代码重做:
link : function(scope, element, attrs, controllers) {
// ...
var current_element_list = scope.$eval(attrs['sortable-model']);
// ...
}