我有以下代码:
<div class="col-md-10" data-ng-controller="type-controller">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-success" ng-model="typeId" data-btn-radio="'1'">
Option 1
</label>
<label class="btn btn-success" ng-model="typeId" data-btn-radio="'2'">
Option 2
</label>
</div>
<input data-ng-model="typeId" name="typeId" type="hidden" data-start="2" />
</div>
我的type-controller
为空,所以我省略了它 - 但我希望从data-start
内的最后一个输入中获取属性type-controller
的值。
我没有使用jQuery。
答案 0 :(得分:1)
Angular内置了jqLite,它仍然具有attr()函数。但是,从控制器手动摆弄DOM并不是Angular“方式”。您的范围应该是它们之间的接口。
我很好奇为什么你的UI中的属性中有一个值,而你的模型/范围中没有先定义它?这个值如何变化?是否有理由不能在控制器中设置它:
$scope.start = 2;
然后:
<input data-ng-model="typeId" name="typeId" type="hidden" data-start="{{start}}" />
您能解释一下数据启动的意义吗?
答案 1 :(得分:1)
如果属性data-start
很重要,因为它正被其他第三方库使用,那么您可以考虑在服务器上创建时使用ng-init
:
<input data-ng-model="typeId" name="typeId" type="hidden" data-start="2"
ng-init='start = 2' />
这将基本上运行您需要的任何代码,并且不涉及您必须从DOM解析数据属性。
您可以编写一个非常简单的指令来拉入值并使用表达式发布。这基本上可以完成同样的事情,但在我看来更难:
angular.module('data-pluck', [])
.controller('fooController', function() {
this.name = 'Foo Controller';
})
.directive('pluckData', ['$parse',
function($parse) {
return {
restrict: 'A',
link: function(scope, elem, attrs) {
var expression = function() {};
expression.assign = function() {};
scope.$watch(attrs.placeData, function() {
expression = $parse(attrs.placeData);
});
scope.$watch(attrs.pluckData, function() {
expression.assign(scope, attrs[attrs.pluckData]);
});
}
};
}
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='data-pluck' ng-controller='fooController as ctrl'>
<h1>{{ctrl.name}}</h1>
<div data-my-val="I'm value one" pluck-data='myVal' place-data='ctrl.valueOne'>
<p>I'm a regular old <code><p></code> tag</p>
<input type='hidden' data-my-val="I'm the second value" pluck-data='myVal' place-data='ctrl.valueTwo' />
</div>
<h3>These Values Populated Dynamically</h3>
<ul>
<li>ctrl.valueOne = {{ctrl.valueOne}}</li>
<li>ctrl.valueTwo = {{ctrl.valueTwo}}</li>
</ul>
</div>