javascript - 通过表单 Controller 访问 div 颜色选择器元素

标签 javascript html angularjs angularjs-directive color-picker

我正在使用这个 library为了向我的 AngularJS 应用程序添加颜色选择器功能。 我想让我的客户使用一种颜色,然后在他面前显示为带圆 Angular 的小方形 div(不是颜色的十六进制,因为我的用户不是技术人员)。 问题来了,当我想让我的用户恢复他们以前的选择时,以防他们不喜欢他们当前的选择(此信息存储在服务中)。

我想访问应用了 colorPicker 指令的 div 的 $pristine 和 $dirty 属性,问题是给 div 命名不是有效的 HTML 标记。

是否有一种“Angular 方法”可以做到这一点(使用内置的 $pristine 和 $dirty),或者我是否必须通过在我的服务中存储一个 bool 标志来解决这个问题?

<form name="designForm">
        <div class="formLine">
            <div class="miniFieldContainerSettings">
                Background Color
            </div>
            <div class="mediumFieldContainerSettings">
                <div data-colorpicker name="bgColor" class="colorSample" ng-model="model.formData.settings.background_color" data-ng-style="{backgroundColor : model.formData.settings.background_color}"><!--CANNOT GIVE A NAME ATTRIBUTE TO A DIV-->
                </div>
                <span class="btn btn-link" data-ng-disabled="designForm.bgColor.$pristine" data-ng-click="model.setDefaultColor('bgcolor')">
                    Restore previous
                </span>
                <span class="btn btn-link" data-ng-click="model.setDefaultColor('bgcolor', true)">
                    Set default
                </span>
            </div>
        </div>
</form>

最佳答案

您可以在 div 上设置名称属性(如果您愿意,也可以使用 data-name)。

您遇到了 datepicker 遇到的类似问题 ( datepicker and ngForm's $pristine state for field ),通过添加对 $setViewValue 的调用解决了该问题.

问题是 $pristine 的变化仅由调用 setViewValue() 触发. Angular 的控件,比如 input为您调用此函数(如 ngModelController 文档注释 ngModelController ):

$setViewValue(value): Update the view value.

This method should be called when the view value changes, typically from within a DOM event handler. For example input and select directives call it.

由于您使用的是 div作为控件,您需要处理对 $setViewValue() 的调用触发 $pristine 的变化.

我们可以通过添加一个使用 watch 的指令来做到这一点调用setViewValue()每当值更改时在颜色选择器模型上。这将导致 $pristine正在更新:

myApp.directive('updateView', function(){
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, controller){
      scope.$watch(attrs.ngModel, function(newValue, oldValue){
        if (newValue !== oldValue){
            controller.$setViewValue(newValue);
        }
      });
    }}
});

最后,我们将新指令添加到您的 div所以 Angular 会将其视为控件:

<div data-colorpicker name="bgColor" class="colorSample" ng-model="model.formData.settings.background_color" data-ng-style="{backgroundColor : model.formData.settings.background_color} update-view">

我在这里创建了一个这样的例子:http://jsfiddle.net/f6uRe/1/

为了简化示例,我触发了与您使用 input 时遇到的相同问题那是在表单之外而不是颜色选择器。它显示了相同的潜在问题和解决方案,但更通用,因此可能会帮助其他人更轻松地了解其工作原理。

关于javascript - 通过表单 Controller 访问 div 颜色选择器元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950964/

相关文章:

javascript - jQuery AJAX 出错时自动刷新

html - 如何将 table 放在 table 里面?

angularjs - 为什么要给 "abstract: true"状态一个 url?

angularjs - 未知提供商 : $provideProvider angularjs jasmine

javascript - ASP.NET 在页面加载时添加 js 文件

javascript - 如何在 Event 对象冒泡之前将其附加到 Event 对象?

c# - 在 HtmlAgilityPack loadhtml 中丢失 'less than' 标志

html - 文本溢出不起作用

javascript - AngularJS 中多个 ng-app 的通用 Controller

javascript - jQuery 在焦点上一次显示一个 TD