【问题标题】:AngularJS directive: Expression 'undefined' used with directive ... is non-assignableAngularJS指令:与指令一起使用的表达式“未定义”......是不可分配的
【发布时间】:2014-03-17 21:04:27
【问题描述】:

我是一个 2 周大的 Angular 菜鸟,我已经尝试了我的第一个指令超过一天了。 :P 我读过thisthis,这似乎是很好的指令介绍和一堆 Stackoverflow 答案,但我无法正常工作。

<div ng-app="App" ng-controller="Main">
  <textarea caret caret-position="uiState.caretPosition"></textarea>
  {{uiState.caretPosition}}
</div>

angular.module('App', [])
  .controller('Main', ['$scope', function ($scope) {
    $scope.uiState = {};
    $scope.uiState.caretPosition = 0;
  }])


  .directive('caret', function() {
    return {
      restrict: 'A',
      scope: {caretPosition: '='},
      link: function(scope, element, attrs) {
        var $el = angular.element(element);
        $el.on('keyup', function() {
          scope.caretPosition = $el.caret();
        });
      }
    };
  }); 

小提琴是here。我基本上是在尝试在文本框中获取插入符号的位置。我在小提琴中使用了这个jQuery plugin(.caret() 方法的来源,它应该只返回一个数字)。

我的问题是

  1. 我还需要一个指令吗? Ben Nadel says 最好的指令是你不必写的(阿门!)
  2. 如果是,这是执行指令的正确方法吗?即具有双向绑定变量的隔离范围?
  3. 如果是,当我在本地运行此代码时,我不断收到错误Expression 'undefined' used with directive 'caret' is non-assignable!。我已阅读 the doc,据我所知,我已按照说明进行了修复,但无济于事。
  4. 奖励:为什么在 jsfiddle 中我没有收到这样的错误。小提琴只是默默地失败了。那是怎么回事?

谢谢!

【问题讨论】:

  • 我认为@Lois 的回答更常见于标题中的角度问题。

标签: angularjs angularjs-directive


【解决方案1】:

我的解决方案在这里更难找到,但更容易实施。我不得不把它改成相当于;

  scope: {caretPosition: '=?'},

(请注意,问号使属性成为可选属性。在 1.5 之前,这显然不是必需的。)

【讨论】:

    【解决方案2】:

    你很接近..主要问题是在 Angular 不知道的事件中更改范围变量。当该事件发生时,您必须使用 scope.$apply 告诉 Angular 发生了一些变化。

      $el.on('keyup', function() {
          scope.$apply( function() {
            scope.caretPosition = $el.caret();
          });
      });
    

    Working fiddle here

    问题:

    1. 是的,我认为不必为此编写指令。
    2. 在这种情况下,看起来不错。
    3. 不确定,jsfiddle 没有问题。听起来你在某处设置carat="something"?检查以确保 html 与小提琴中的内容相同。
    4. 同3

    另请注意,如果您单击并移动插入符号,它不会更新,因为它只是在监听 keyup。

    【讨论】:

    • 该死,我已经尝试过范围了。$apply 也是基于这篇优秀的文章! link(滑块示例)。当时一定是有其他问题。你的回答修复了小提琴,所以接受了!我的应用程序中仍然出现错误。确实是因为小提琴与我的代码不匹配! :P 我的代码中定义了两个文本区域,一个缺少插入位置属性。许多并发错误的情况,并且不知道错误消息描述的是哪一个!
    • 已提交 request 以更新 Angular 文档
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多