当前位置: 首页 > 面试题库 >

在AngularJS中是否可以在经典javascript函数中使用数据绑定?

计和顺
2023-03-14
问题内容

我对 Angularjs数据绑定 功能有疑问。

如果我写:

<div>Hello {{name}}!</div>

而且我在 controller.js中 是这样的:

$scope.name = 'Bruno';

结果将是“你好布鲁诺!” …这太棒了!现在,我编辑了模板:

<div>Hello <span id="name"></span>!</div>

而且我还在关闭主体之前添加了此javascript函数:

<script src="lib/angular/angular.js"></script>
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
<script src="js/directives.js"></script>

<script type="text/javascript">

  function fillName(subject) {
    $("#name").text("Hello " + subject);
  }

  fillName({{name}}); // this throws "SyntaxError: invalid property id"

</script>
</body>

所以我的问题是:

在AngularJS中是否可以在经典javascript函数中使用数据绑定?

更新:

// i changed: fillName({{name}}); with:
fillName('{{name}}');

这样就解决了错误…但是仍然没有出现名称…我仍在努力中…

建议永远欢迎!


问题答案:

[更新]好吧,看来您似乎已经解决了您的问题,我似乎误解了您的问题,但是也许其他人会根据问题的标题偶然发现这些信息。

我将以以下警告为前缀:如果您正在编写AngularJS应用程序,则需要使用Angular提供的功能(如指令)来进行此类操作,而不是超出Angular应用程序生命周期并编写代码全局功能等。但是,为了这个问题的学术答案,这里是。

总览

您尝试在此处使用的Angluar魔术基于以下几种功能:

范围 (docs)

范围为Angular表达式(您放入属性和双重curl的东西)提供了上下文,并提供了在该上下文中监视这些表达式的评估变化所需的功能。例如,Scope#$watch允许您注册一个回调,该回调在表达式的求值发生更改时执行。

$ interpolate (docs)

Interpolate接受一个字符串,该字符串可以在双curl中包含表达式,然后将其转换为新字符串,并将表达式结果插值到原始字符串中。(调用$interpolate(str)返回一个函数,当对提供范围的对象进行调用时,该函数返回一个字符串。)

把它放在一起

在编写Angular应用程序时,您通常不必担心这些细节-
您的控制器会自动传递一个范围,并且您的DOM文本会自动插值。由于您尝试在Angular应用程序的生命周期 之外
访问这些内容,因此您将不得不跳过一些以前隐藏的篮球。

angular.injector (docs)

当您使用,等在模块上注册服务,过滤器,指令等时app.controllerapp.factory注入器将调用您提供的功能。Angular在Angular应用中为您创建了一个,但是由于我们没有使用它,因此您需要使用angular.injector自己创建一个。

有了注入器后,就可以injector.invoke(fn)用来执行函数fn并注入任何依赖项(例如$interpolate),以在函数内部使用。

一个简单的例子

这是一个非常基本的例子

  • 提供输入和变量之间的双向数据绑定
  • 使用以下命令将数据绑定到HTML视图中 $interpolate
    Name: <input id="name" type="text" autocomplete="off">
    <button id="setname">Set name to Bob</button>
    <div id="greeting"></div>



    var injector = angular.injector(['ng']);

    injector.invoke(function($rootScope, $interpolate) {
      var scope = $rootScope.$new();
      var makeGreeting = $interpolate("Hello {{name}}!");

      scope.$watch('name', function() {
        var str = makeGreeting(scope);
        $("#greeting").text(str);
        $("#name").val(scope.name);
      });

      var handleInputChange = function() {
        scope.$apply(function() {
          scope.name = $('#name').val();
        });
      };

      var setNameToBob = function() {
        scope.$apply(function() {
          scope.name = "Bob";
        });
      };

      $("#name").on('keyup', handleInputChange);
      $("#setname").on('click', setNameToBob);
      handleInputChange();
    });

这是演示该技术的jsFiddle:http :
//jsfiddle.net/BinaryMuse/fTZu6/



 类似资料:
  • 我有一个通知组件,我有一个超时设置。超时后,我调用。 我想做的是,如果已经超时,我想只呈现任何内容: 问题是: 返回();//这里有一些语法错误

  • 问题内容: 我只想从任何可能的字符串中创建一个正则表达式。 有内置的方法吗?如果没有,人们会使用什么?红宝石有。我觉得我不需要自己写东西,那里肯定有一些标准。谢谢! 问题答案: 上面链接的功能不足。它无法转义或(字符串的开头和结尾)或,这在字符组中用于范围。 使用此功能: 乍看起来似乎没有必要,但是转义(以及)使该函数适合于转义要插入字符类和正则表达式主体的字符。 转义使该函数适合转义要在JS正则

  • 问题内容: 我想使用Streams.intRange(int start,int end,int step)实现反向排序的流。但是,似乎java.util.Streams类不再可用(但是它仍在标准库的rt.jar中)。此方法是在其他类中还是被其他方法替代? 问题答案: 实际上,JDK中再也没有这种方法了。您能获得的下一个最接近的位置是,但是只会一步一步走。 一种解决方案是实施您自己的解决方案。例如

  • 问题内容: 基本上,我有一个react组件,其功能主体如下:(这是我的理想组件,这意味着它当前不起作用) 问题答案: 不完全一样,但是有解决方法。在React的文档中有一节关于条件渲染,您应该看一下。这是使用内联if-else可以做什么的示例。 您也可以在render函数中处理它,但是要在返回jsx之前。 还值得一提的是ZekeDroid在评论中提到的内容。如果您只是检查条件而又不想呈现不符合要求

  • 我制作了一个类 在另一个类中 正如您所看到的,我创建了这个数组,并将UImages与txt和txt2一起放置在其中。简单地说,我要向用户显示一个图像,然后输入一个描述图像的输入,然后检查它是否匹配txt和txt2。在运行模拟器时,我得到以下错误: ***由于未捕获异常“nSunKnownKeyException”而终止应用程序,原因:“[ SetValue:ForUndefinedKey:]:对于

  • 问题内容: 我试图弄清楚当我的数据存储在服务中时如何正确处理绑定。 如果将服务放到$ scope中,然后让模板直接绑定到它中,我可以使事情工作,但这似乎是一个糟糕的主意。 我基本上希望拥有它,以便我的视图/控制器能够轻松地将状态更改为服务,并将其反映到各处。 感觉我应该可以执行以下操作,但是不起作用(http://jsfiddle.net/aidankane/AtRVD/1/)。 的HTML JS