0

我正在创建自定义指令,我需要在对象内部分配函数,该函数将在传递给我的指令时使用。但是,如果我通过直接在模板中写入函数的名称来传递方法,它的工作正常。但是,如果我将该方法引用分配给我的一个对象属性,然后我在我的模板中使用它来将它传递给指令,但这不起作用。

你可以在这里看到 - jsfiddle

您可以在控制台中看到。单击“保存”按钮,它将在指令内调用保存函数,但从那里我正在调用不起作用的控制器方法。但是如果你改写函数名blabla,那么dynamicMethods.myMethod它会调用,但我在警报中没有定义。

谢谢你。

4

1 回答 1

1

你几乎是对的。

第一个错误是当你定义dynamicMethods你正在引用的对象时$scope.blabla,它还不存在。

第二个错误是当您将值传递给accept绑定到父范围的函数调用时,您需要将其传递为:

$scope.accept({msg: "from dir"})

wheremsg是一个名为的局部变量,可以在accept自定义指令调用的属性表达式值中使用<editkeyvalue accept="dynamicMethods.myMethod(msg)" ...

我已经相应地更新了你的小提琴

当您写作时,accept: "&"您是在告诉 Angular 到

  1. 使用$parse服务解析表达式 ( dynamicMethods.myMethod(msg))
  2. 从步骤 1 返回的函数的“绑定”(通过javascript 闭包)到原始范围(在您的情况下为控制器的范围)$scope
  3. 将函数存储在accept指令本地范围的属性内。

现在,如果您$scope.accept在指令中调用它之前检查内容,您将类似于:

function (locals) {
  return parentGet(parentScope, locals);
}

wherelocals是一个具有局部变量的对象,当我们对从 . 返回的函数进行评估时使用$parse。由于 javascript 中没有命名参数,我们不想以某种方式指出 value 局部变量msg是“来自 dir”,我们将它作为一个简单的对象传递,其中 key 表示变量 name {msg: "from dir"}

Angular 会查看表达式(一个字符串)来评估并msg在括号内找到它,因此它看起来像一个参数,可以在locals对象中找到该值。

当需要调用实际函数时,angular 会将locals对象转换为常规数组 - 保留它从表达式中读取的参数顺序并以类似于以下方式调用函数:

var locals = {msg: "from dir"};
var targetFn = dynamicMethods.myMethod;
var context = dynamicMethods;
targetFn.apply(context, ["from dir"]);

希望这有助于了解正在发生的事情。

于 2014-07-31T11:28:38.680 回答