У меня есть прецедент, где мне нужна директива ползунка, чтобы динамически обновлять конфигурацию и значение модели через контроллер. Для этого я пытаюсь создать двухстороннюю привязку данных. Однако я не могу найти правильный способ создания двухсторонней привязки данных в директиве. Ниже приведен код. В настоящее время слайд-событие на слайдере запускает директиву для обновления "scope.model". Хотя он не отвечает на обновления контроллера для "scope.config" или "scope.model":
.directive("slider", function() {
return {
restrict: 'A',
scope: {
config: "=config",
model: "=model",
trigger: '=trigger'
},
link: function(scope, elem, attrs) {
//Data Binding to be done here using $watch for scope.model
$(elem).slider({
range: "min",
min: scope.config.min,
max: scope.config.max,
value: scope.model,
step: scope.config.step,
slide: function(event, ui) {
scope.$apply(function() {
scope.model = ui.value;
});
console.log(scope.model);
scope.$apply(scope.trigger);
}
});
}
}
});
Пожалуйста, помогите мне в этом. Я прошел все доступные ответы, но не смог найти подходящий ответ
ngModelController
свою директиву на ngModelController
. Таким образом вы можете использовать функциональность ngModel
для привязки всего и использовать ngChange
для запуска обратного вызова без необходимости $watch
(plunkr):
app.directive("slider", function() {
return {
restrict: 'A',
scope: {
config: "=config"
},
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
var init = false;
var $slider = $(elem);
ngModel.$render = function() {
if (!init) {
$slider.slider({
range: "min",
min: scope.config.min,
max: scope.config.max,
step: scope.config.step,
slide: function(event, ui) {
scope.$apply(function() {
ngModel.$setViewValue(ui.value);
});
}
});
init = true;
}
$slider.slider('value', parseInt(ngModel.$viewValue, 10));
}
}
}
});
Применение:
<div id="km-slider" class="slider" slider="" config="milesSliderConfig"
ng-change="filterCars(sliderRanges.kms)"
ng-model="sliderRanges.kms"></div>
[ 75, 300 ]
, и всякий раз, когда значение обновляется, вы должны заменить массив (чтобы вызвать изменение модели), а не только значение.
Я решил решить это, используя $ watch
//watch the Model to set slider when val in Model var changes
scope.$watch('model', function(newVal, oldVal){
//check when Model is not initialized
if (newVal !== undefined){
elem.slider("value", parseInt(newVal,10));
}
});