【问题标题】:directive "link" doesn't apply as I want it指令“链接”不适用于我想要的
【发布时间】:2014-12-16 16:30:18
【问题描述】:

好的,我得到了一个页面,其中包含一些使用 angular x-editable 管理的输入。

fiddle

以下指令:

treeView.directive('selectWhenEditing',function(){
    var linkFunction = function(scope,startingelem,attr)
    {
        console.log(startingelem[0]);
        console.log (startingelem[0].querySelector('.editable'));
        angular.element(startingelem[0].querySelector('.editable')).on('click',function(){   
            //console.log(startingelem[0]);
            angular.element(startingelem[0].querySelector('.editable-input').select());            
        });

    };
    return{
        restrict: 'AEC',
        link:linkFunction
    };}
);

当我单击可编辑元素时,应该会选择文本。

这是页面的代码:

<tr ng-repeat="properties in elementToEdit" ng-if="fieldsSettings[$index][1]==1">
            <td>
                    {{ fieldsSettings[$index][0] }}
            </td>
            <td data-select-when-editing>                                    
                <span editable-text="properties.prop" onbeforesave="" ng-if="fieldsSettings[$index][2]== 'text'">
                            {{ properties.prop || 'empty' }}               
                </span>
                <span editable-select="properties.prop" onbeforesave="" ng-if="fieldsSettings[$index][2]== 'select'" e-ng-options="s.value as s.text for s in fieldsSettings[$index][3]">
                            {{ selectElement(properties.prop,$index) || 'empty' }}               
                </span>
            </td>                                
    </tr>

这就是相关的编译 HTML:

<tr class="ng-scope" ng-if="fieldsSettings[$index][1]==1" ng-repeat="properties in elementToEdit">
    <td class="ng-binding"> Name </td>
    <td data-select-when-editing="">
        <span class="ng-scope ng-binding editable editable-click" ng-if="fieldsSettings[$index][2]== 'text'" onbeforesave="" editable-text="properties.prop"> Food </span>
    </td>
</tr>

该指令按我的意愿触发(例如:期望它的次数)。 第一个 console.log 按预期记录了调用 TD 元素。但是第二个是空的,因为它永远不会在这个 TD 中找到元素“.editable”,所以显然永远不会选择文本(不应用事件“on”)。

我在另一个页面/模块中做了完全相同的事情,而且效果很好。我正在比较代码,但找不到差异。

你们看到了什么?

【问题讨论】:

  • 建议利用jQlite,它使用jQuery方法语法和startingelem.find('.editable')。无需创建新的angular.element,因为startingelem 已经是一个
  • 好的,谢谢……现在它确实找到了一个元素,但是当我在它上面应用“点击”事件时……我明天早上再试一次,已经晚了:)
  • 好的,我实际上正在这样做,它会找到一个元素,但是如果我这样做,则开始elem.find('.editable').text() 控制台是“空字符串”,事实并非如此。我不确定它是否选择了正确的东西......
  • 创建一个复制您的问题的演示
  • jsfiddle.net/Morgorth/xezbs8gn 这是小提琴,有点简化,但在控制台中得到相同的结果

标签: javascript angularjs angularjs-directive x-editable


【解决方案1】:

正如docs 中所说,jqLit​​e 的find() 函数是“仅限于按标签名称查找”,这意味着您不能使用它来按类选择元素-因此您需要改用querySelector .请注意,使用时您还需要startingelem[0] 而不仅仅是startingelem

我不得不使用angular.element 来获取jqLit​​e 对象以进行on() 绑定(你可以在那里使用plainJS,如下所示),所以看起来有点难看:

angular.element(startingelem[0].querySelector(".editable")).on('click',function(){
    startingelem[0].querySelector('.editable-input').select();
});

这是完整的工作版本:http://jsfiddle.net/ar7znuz5/


使用addEventListener的纯JS版本:

startingelem[0].querySelector(".editable").addEventListener('click',function(){
    startingelem[0].querySelector('.editable-input').select();            
});

完整版:http://jsfiddle.net/ar7znuz5/1/


最后一个版本,带有选择和更新的原始代码:http://jsfiddle.net/ar7znuz5/7/

【讨论】:

  • 感谢您的回答。如果您查看堆栈上的代码而不是小提琴上的代码,您会发现它正是我最初编写的。然后问题仍然存在(显然小提琴没有重现错误......),尽管通过比较我的确切代码和小提琴可以看到,编译的 HTML 的差异很小,JS 是相同的......
  • 看看这个:
  • 看看这个:jsfiddle.net/Morgorth/ar7znuz5/2我重复了上面写的代码,似乎放两个带有ng-if条件的“span”会破坏链接功能,这可能是由于时间问题不知何故..我不确定..
  • 那里有语法错误,请参阅固定链接:jsfiddle.net/ar7znuz5/3 现在看起来不错,对吧?
  • 是的,似乎 ng-ifs 实际上会导致延迟,执行时跨度不可用。您可以添加观察者来解决此问题,但最简单的解决方案是将点击监听器附加到根元素(td 本身)上,请参见此处:jsfiddle.net/ar7znuz5/5
猜你喜欢
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2017-04-23
相关资源
最近更新 更多