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

为什么不能覆盖这样的变量的值?

万俟棋
2023-03-14
问题内容

我试图弄清楚为什么我无法覆盖通过隔离范围(@)传递给angularJS指令的值。我尝试vm.index使用以下方法覆盖的值:

vm.index = parseInt(vm.index, 10)

但是,由于某些原因,它不起作用。

如果我将其更改为:

vm.newIndex = parseInt(vm.index, 10)

有用。另外,在$scope作品上分配价值。

为什么第一种方法不起作用?

我已经创建了这个示例插件。


问题答案:

如您@在此处使用的那样,需要通过{{}}插值指令从属性获取值。似乎指令首先被加载,然后vm.index值被求值。因此,在当前摘要周期中不会发生更改。如果希望这些内容得到反映,则需要使用$
timeout以更安全的方式运行摘要循环。

$timeout(function(){
  vm.index = parseInt(vm.index, 10)
})

上面的事情是确保将值转换为十进制值。加法将出现在指令html上<h2>Item {{ vm.index + 1 }}</h2>

工作演示

这背后的可能原因

根据@dsfq和我的讨论,我们遍历了angular
$compile
API,发现它们是一个方法调用
initializeDirectiveBindings
,仅当我们controllerAs在具有隔离范围的in指令中使用时才调用。在这个功能有开关的情况下的各种结合@=并且&,这样你使用@,这意味着一个双向绑定下面的开关情况下的代码被调用。

case '@':
    if (!optional && !hasOwnProperty.call(attrs, attrName)) {
        destination[scopeName] = attrs[attrName] = void 0;
    }
    attrs.$observe(attrName, function(value) {
        if (isString(value)) {
            destination[scopeName] = value;
        }
    });
    attrs.$$observers[attrName].$$scope = scope;
    if (isString(attrs[attrName])) {
        // If the attribute has been provided then we trigger an interpolation to ensure
        // the value is there for use in the link fn
        destination[scopeName] = $interpolate(attrs[attrName])(scope);
    }
    break;

在上面的代码中,您可以清楚地看到它们放置在attrs.$observe其中,这是一种观察者,通常在值与插值一起使用时(例如在我们的示例中是相同的){{index}},这意味着$observe在摘要循环运行时会对其进行评估,这就是为什么需要$timeout在创造index价值的同时投入decimal

@dsfq答案之所以有效,是因为他使用=了提供两种方式的绑定,这些代码不会使观察者直接从隔离的范围中获取值,
这是代码
。因此,没有摘要循环,该值将被更新。



 类似资料:
  • 我只需要我测试对象获得新的数据,但是在异步函数中重写它之后,它仍然是旧的

  • 问题内容: 我得到输出b 3。为什么它没有给出b13作为输出。任何人都可以解释一下。 问题答案: 假设Foo类声明如下 变量没有覆盖的概念。他们只是被蒙面。 它正在打印3,因为当您使用超类引用访问变量时,它仅访问在超类中声明的变量。 请记住,超类对子类一无所知。

  • 我有一个具有2种口味的android应用程序:-味道1-味道2 我的目录树是: main有默认的源集。味道1和味道2目录有自己的源集,它会自动获取。如果我将资源文件添加到味道目录中,它会从main覆盖它,并且工作正常。 但是,如果我在snorty2中添加一个java类以覆盖“main”中的另一个类(例如,一个需要在slavor2中不同的活动),它不会替换它,并且它说我的项目中有一个重复的类。我只能

  • 为什么允许使用memcpy指针更改常量变量? 此代码: 编译时只包含一个警告: 警告:传递“memcpy”的参数 1 将丢弃指针目标类型中的“const”限定符 [默认启用] 但运行得很好,并更改了常量变量的值。

  • 问题内容: 请参阅下面的代码,其中的方法被覆盖,但变量没有被覆盖。为什么允许在子类中声明重复的变量? 问题答案: 为什么在子类方法中不覆盖超类的实例变量,请参见下面的代码… 因为实例变量不能在Java中覆盖。在Java中,只能重写方法。 当你声明一个与超类中现有字段同名的字段时,新字段将隐藏现有字段。超类中的现有字段仍存在于子类中,甚至可以使用…遵守常规的Java访问规则。 因为实例变量在Java

  • 问题内容: 这些变量分配按预期工作: 但是,这些分配的行为不同: 为什么与示例不同,为什么相同?我如何在类示例中做类似的事情?也就是说,复制对象,然后更改它的一部分(那不会影响我借用属性的对象)吗? 问题答案: 我没有看到有人通过复制对象而不是仅仅为同一对象分配新的引用来提供有关如何使这两种情况相同的详细信息。 这将为您提供: