我在angularjs中有一个自定义指令。基本上我想要发生的是用户将从选择框中选择一个值,并将值附加到数组。这会导致我的自定义指令被调用并在屏幕上呈现一个新元素。我希望指令生成的文本字段绑定到控制器的属性。
HTML
<device-list ng-repeat="device in devices" key="device.key" display-name="device.display_name" bind-prefix="descriptions"></device-list>
指令
angular.module('device_list_tag', []).
directive('deviceList', function() {
return {
restrict: 'E',
require: '?ngModel',
scope: {
devices: '=',
key: '=',
displayName: '=',
bindPrefix: '@'
},
link: function(scope, element, attrs) {
var deviceListElement = $(element)
var containerDiv = $('<div>')
.addClass('row')
var labelTag = $('<label>').text(scope.displayName)
.addClass('span1')
var bindField = attrs.bindPrefix+'.'+scope.key
var textField = $('<input>')
.addClass('span3')
.attr('ng-model', bindField)
containerDiv.append(labelTag)
containerDiv.append(textField)
deviceListElement.append(containerDiv)
}
}
})
控制器
function DevicesCtrl($scope) {
descriptions = {}
}
似乎ng-model是指令范围的本地,如何将其应用于父级?如果我在页面上有一堆文本字段,如
<input ng-model="descriptions.test"/>
除了选择框生成的字段外,它的工作正常。
答案 0 :(得分:9)
好的,我明白了。它涉及将我的父属性传递为'='(由Tosh建议)。我还必须调用$ compile以使其识别ng-model指令。这是完整的代码,我确信有一种方法可以做到更清洁,但我很高兴让它工作。
angular.module('device_list_tag', []).
directive('deviceList', function($compile) {
return {
restrict: 'E',
scope: {
devices: '=',
key: '=',
displayName: '=',
bindAttr: '=' // added
},
link: function(scope, element, attrs) {
console.log(scope)
var deviceListElement = $(element)
var containerDiv = $('<div>')
.addClass('row')
var labelTag = $('<label>').text(scope.displayName)
.addClass('span1')
var bindField = 'bindAttr.'+scope.key
var textField = $('<input>')
.addClass('span3')
.attr('ng-model', bindField)
$compile(textField)(scope) // added
containerDiv.append(labelTag)
containerDiv.append(textField)
deviceListElement.append(containerDiv)
}
}
})
答案 1 :(得分:2)
您可以在范围指令定义中添加bindField: '='
。
并使用此变量连接到父作用域。
答案 2 :(得分:1)
你要的是,
1)保持父范围数组更新,同时编辑隔离范围表单元素。如果是的话,我在这个小提琴http://jsfiddle.net/W7YrZ/2/中复制了类似的场景。
我想要做的总结。
1)在umbilical
中使用迭代的当前项目分配属性ng-repeat
。
2)然后我在父作用域的上下文中对链接函数内部的这个属性进行评估,它给出了父作用域数组中一个数组对象的引用(指针){。{1}}。
3)然后,正如@Mark Rajcok所说,“基元是按值复制的,而对象是通过引用复制的”。我将通过第2步获得的对象绑定到模板字符串中的文本框。
答案 3 :(得分:-3)
出于角度和验证javascript中jQuery代码清洁的原因,只需替换$
中的选择器angular.element
$('<input>').addClass('span3')
必须写
angular.element('<input>').addClass('span3')