2013-05-07 3 views
0

Я относительно новичок в нокауте и задавался вопросом, есть ли лучший способ контролировать видимость двух элементов div, основанных на выборе группы переключателей.Управление видимостью элементов div на основе выбора переключателя

Что я придумал, кажется довольно хрупким, и если бы они были дополнительными вариантами, это решение не масштабировало бы imo.

<label>Total</label><input type="radio" name="toggleGraph" value="total" data-bind="checked: toggleGraph" /> 
<label>Growth</label><input type="radio" name="toggleGraph" value="growth" data-bind="checked: toggleGraph" /> 

<div id="total-graph" data-bind="visible: $root.toggleGraph() === 'total'"> 
    Total Graph Here 
</div> 

<div id="growth-graph" data-bind="visible: $root.toggleGraph() === 'growth'"> 
    Growth Graph Here 
</div> 



var ViewModel = function() { 
    var self = this; 
    self.toggleGraph = ko.observable('total'); 
} 

ko.applyBindings(new ViewModel()); 

http://jsfiddle.net/pqzhL/

+1

Что вы хотите сказать? В чем проблема с вашим нынешним подходом? Я не вижу ничего плохого в твоем решении, а твои скрипки - просто отлично ... – nemesv

+0

В конечном счете ты ответил на мой вопрос. Я честно не знал, было ли это приемлемым использованием привязки видимости в мире нокаутов. – Jesse

+0

Я не могу говорить за «мир нокаутов», потому что KO - это только хобби для меня, и я никогда не использовал его ни в одном сценарии реального мира :), но я не думаю, что ничего плохого в том, как вы использовали привязку видимости для этого сценария. Поэтому я предложил несколько «рефакторингов», которые могут упростить/уменьшить дублирование в вашем текущем подходе. – nemesv

ответ

1

Ваш текущий подход хорошо. Вам нужно наблюдать (toggleGraph), чтобы сохранить выбор, и в зависимости от его значения вы можете показать скрыть свой div.

Если вы хотите использовать логику, когда total или growth выбран вы можете переместить логику проверки с вашей точки зрения на ваш ViewModel в вычисляемых свойств:

<div id="total-graph" data-bind="visible: isTotalSelected"> 
    Total Graph Here 
</div> 

<div id="growth-graph" data-bind="visible: isGrowthSelected"> 
    Growth Graph Here 
</div> 

var ViewModel = function() { 
    var self = this; 
    self.toggleGraph = ko.observable('total'); 
    self.isTotalSelected = ko.computed(function() { 
     return self.toggleGraph() === 'total' 
    }); 
    self.isGrowthSelected = ko.computed(function() { 
     return self.toggleGraph() === 'growth' 
    }); 
} 

Но если у вас есть много вариантов этого решения не масштабируется, потому что вам нужно создать множество вспомогательных свойств.

Или вы можете создать пользовательские связывания обработчик, который делает некоторые на основе проверки конвенции, которая сравнивает div идентификатор с выбранным значением:

ko.bindingHandlers.visibleIfIdStartsWith = { 
    update: function (element, valueAccessor, allBindingsAccessor, 
         viewModel, bindingContext) { 
     var newAccessor = function() { 
      return element.id.indexOf(valueAccessor()()) === 0; 
     } 
     ko.bindingHandlers.visible.update(element, newAccessor, 
      allBindingsAccessor, viewModel, bindingContext); 
    } 
}; 

Затем использовать его как это:

<div id="total-graph" data-bind="visibleIfIdStartsWith: toggleGraph"> 
    Total Graph Here</div> 
<div id="growth-graph" data-bind="visibleIfIdStartsWith: toggleGraph"> 
    Growth Graph Here</div> 

Демо JSFiddle.

Смежные вопросы