从指令更新范围变量 (angularJS)
Update a scope variable from a directive (angularJS)
我有一个指令要应用于多个输入元素以更改它们的值。我已经成功地将它应用于输入元素值,但由于某种原因没有反映在范围中。我是 Angular 的新手,如果我遗漏了一些明显的答案,我深表歉意。
http://jsfiddle.net/hmko75td/ JS Fiddle
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<select ng-model='Factor'>
<option value=1>1</option>
<option value=2>2</option>
<option value=5>5</option>
</select>
<br />
<input convert-input ng-model="myNumber">
{{myNumber}}
<br />
<input convert-input ng-model="myNumber2">
{{myNumber2}}
<br />
<input convert-input ng-model="myNumber3">
{{myNumber3}}
<br />
</div>
</div>
var app = angular.module('myApp',[]);
app.controller('MyCtrl', function($scope) {
$scope.myNumber = 1;
$scope.myNumber2 = 2;
$scope.myNumber3 = 3;
$scope.Factor = 1;
});
app.directive("convertInput", function () {
return {
require: 'ngModel',
restrict: "A",
link: function (scope, element, attrs) {
scope.$watch('Factor', function () {
if(scope.Factor){
element[0].value = scope.Factor * element[0].value;
}
});
}
};
});
这个简化的例子说明了我的问题的症结所在。更改下拉列表的值时,它会正确更新页面上元素的值,但不会正确转换回范围变量。
关于如何 1) 告诉指令哪个范围变量需要更新或 2) 强制模型根据输入值更新有什么想法吗?
谢谢!
我在您的代码片段中看到的一个限制是您需要使用 convert-input
指令来共享 Factor
,它存在于封闭的父范围中。
在这种情况下,一种可行的方法是使用传递到指令中的 attrs
来提取 ng-model
绑定的名称,然后通过 [= 更新相应的绑定15=].
scope[attrs.ngModel] *= scope.Factor;
这是您的 JSFiddle 的一个分支,演示了这一点:
http://jsfiddle.net/m4hvre2y/
让指令在父范围内更新 ng-model
的另一种方法是声明 two-way 绑定(例如 scope: { ngModel: '='
),但它不适用于您的情况,因为到我上面提到的约束。如果你这样做,隔离范围意味着你无法访问 Factor
除非它被明确传递到指令中。
我有一个指令要应用于多个输入元素以更改它们的值。我已经成功地将它应用于输入元素值,但由于某种原因没有反映在范围中。我是 Angular 的新手,如果我遗漏了一些明显的答案,我深表歉意。
http://jsfiddle.net/hmko75td/ JS Fiddle
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<select ng-model='Factor'>
<option value=1>1</option>
<option value=2>2</option>
<option value=5>5</option>
</select>
<br />
<input convert-input ng-model="myNumber">
{{myNumber}}
<br />
<input convert-input ng-model="myNumber2">
{{myNumber2}}
<br />
<input convert-input ng-model="myNumber3">
{{myNumber3}}
<br />
</div>
</div>
var app = angular.module('myApp',[]);
app.controller('MyCtrl', function($scope) {
$scope.myNumber = 1;
$scope.myNumber2 = 2;
$scope.myNumber3 = 3;
$scope.Factor = 1;
});
app.directive("convertInput", function () {
return {
require: 'ngModel',
restrict: "A",
link: function (scope, element, attrs) {
scope.$watch('Factor', function () {
if(scope.Factor){
element[0].value = scope.Factor * element[0].value;
}
});
}
};
});
这个简化的例子说明了我的问题的症结所在。更改下拉列表的值时,它会正确更新页面上元素的值,但不会正确转换回范围变量。
关于如何 1) 告诉指令哪个范围变量需要更新或 2) 强制模型根据输入值更新有什么想法吗?
谢谢!
我在您的代码片段中看到的一个限制是您需要使用 convert-input
指令来共享 Factor
,它存在于封闭的父范围中。
在这种情况下,一种可行的方法是使用传递到指令中的 attrs
来提取 ng-model
绑定的名称,然后通过 [= 更新相应的绑定15=].
scope[attrs.ngModel] *= scope.Factor;
这是您的 JSFiddle 的一个分支,演示了这一点: http://jsfiddle.net/m4hvre2y/
让指令在父范围内更新 ng-model
的另一种方法是声明 two-way 绑定(例如 scope: { ngModel: '='
),但它不适用于您的情况,因为到我上面提到的约束。如果你这样做,隔离范围意味着你无法访问 Factor
除非它被明确传递到指令中。