我有一个服务器端模板(ZPT),其中我将一个选择框填充为:
<select id="state">
<option value="">----</option>
<option tal:repeat="state states" tal:attributes="value state/code" tal:content="state/desc"></option>
</select>
我想使用 angularjs 向选择框添加一些动态的东西,我正在编写一个 angular 指令,它可以在选择框上初始化模型。以前我使用 $scope.state = document.getElementById('state').value 设置我的 ng-model 的初始值,但有人建议我应该在指令中而不是在控制器中完成 DOM 操作。
所以现在我正在尝试编写这个指令,该指令对于模板呈现的所有 HTML 标记都是通用的,并为选择标记添加特殊情况。
.directive('initModelFromServer', function() {
return {
restrict: 'A',
require: 'ngModel',
link : function(scope, elm, attr, ngModelCtrl) {
if (attr.type === 'text'){
ngModelCtrl.$setViewValue(elm.val());
}
var tagName = elm[0].nodeName;
if (tagName === 'SELECT'){
ngModelCtrl.$setViewValue(elm[0].children(elm[0].selectedIndex));
}
}
};
然后将指令应用于我的标签:
<select id="state" ng-model="state" init-model-from-server>
<option value="">----</option>
<option tal:repeat="state states" tal:attributes="value state/code" tal:content="state/desc"></option>
</select>
问题是当我找到选择标记时执行 elm[0].selectedIndex 时,它始终设置为 0。我尝试了其他方法,通过查找 select 的子项并在选项上查找 selected 属性但无法实现相同的功能。
我不想从我的服务器端模板发送一个 json 对象并将其分配给角度变量,因为这样将有更多数据传递给客户端。我宁愿想要一个指令,它可以直接使用链接方法中的 DOM 操作来初始化模型,以用于服务器呈现的所有类型的 HTML 标记。
提前致谢!