angularjs指令可选参数

时间:2016-03-30 20:53:03

标签: angularjs angularjs-directive

在页面编译期间,angular会抛出以下错误:

  angular.js:371 Error: [$compile:nonassign] http://errors.angularjs.org/1.2.10/$compile/nonassign?p0=undefined&p1=wlDragEvent
at Error (native)

我已在指令中将可选参数(属性)定义为:

  wlDragEvent: "@?wlDragEvent"

我也试过用@和=来定义它?以前,但没有什么区别。

指令模板具有硬编码值," MoveCell"这应该是好的,它是一个属性,不应该需要一个模型,对吗?:

   <div data-wl-drag-event="MoveCell" 

首先,对于创建的每一行(ng-repeat)都不会抛出错误,我已经使用了一些console.log来尝试并指出错误,但我找不到模式

  <div class="row">

    <div id="container" class="col-md-12">
        <div data-ng-repeat="r in rows" class="col-md-12"
             data-wl-drag-container="DContainer" data-ng-model="moveData"
             data-drop-data="itemId">

            <div class="gridRow">

                <div data-ng-repeat="item in items | orderBy:'startIndex'" class="cellContainer">
                    <div data-wl-drag-event="MoveDaySlot" data-drag-data="item.resId"
                         data-drop-data="$parent.roomChartRow.room.roomId"
                         class="roomChartCell col-md-{{item.range}} dragCell" style="padding:0 1px 0 1px;">
                        <div data-ng-if="showOption(item)"
                             class="gridCell">{{item.text}}</div>
                    </div>
                </div>

            </div>
        </div>
     </div>
   </div>

js部分:

app.directive("wlDragEvent", ["$parse", function ($parse) {      
    return {

        restrict: "A",
        scope: {
            dragData: "=",
            dropData: "=",
            moveData: "=",
            wlDragEvent: "@?wlDragEvent"
        },
        link: function (scope, element, attributes) {
            if (attributes.wlDragEvent) {
                scope.wlDragEvent = attributes.wlDragEvent;
            } else {
                scope.wlDragEvent = "";
            }
            //...
        }
    };

}]);

  app.directive("wlDragContainer", ["$parse", function ($parse) {
      return {
             restrict: "A",
             controller: ["$scope", function($scope) {
                          $scope.$ctrl = this;
                         this.moveData = {
                         from: {
                               scope: "",
                               dragData: "1"
                          },
                          to: {
                          scope: "",
                          dropData: "2"
                      }
                  }
              }
          ],
          scope: true,
          link: function (scope, element, attributes) {
               scope.moveData = scope.$ctrl.moveData;
               console.log("wlDragContainer scope: %O", scope);
          }
        }
   }]);

我已经看了几个小时,没有什么突出的。我们将锁定到版本1.2.x,以防有建议升级版本或者在此版本中是否存在特定需要的东西。

谢谢!

1 个答案:

答案 0 :(得分:0)

您无法使用&#39; =&#39;为属性分配硬编码值。 (双向绑定)指定,无论它是否可选。当指令中的值发生变化时,它将尝试使用它将该值分配回控制器/指令,并且无处可放置它。我会认为&#39; @?&#39;会对你有用但如果不是你可以试着保持&#39; =?&#39;并将范围变量分配给&#39; MoveCell&#39;并使用该值代替硬编码。