【问题标题】:Injector returns undefined value?注射器返回未定义的值?
【发布时间】:2014-01-13 16:33:09
【问题描述】:
  1. 我正在尝试从我的旧代码中获取服务,但遇到了一个奇怪的错误,injector() 返回未定义:

    Check this plnkr


  1. 另外,我正在尝试将新属性值设置回服务,这是否会在不使用 watch 的情况下反映到范围?

非常感谢,任何指点或建议都非常感谢。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您试图在 DOM 构建之前获取元素。这与在$(document ).ready() 之外运行 javascript 基本相同。所以这一行没有要获取的元素:

    var elem = angular.element($('#myCtr'));
    

    另外,顺便说一下,代替使用 jQuery,执行上述操作的另一个 Angular 选项是:

    var elem = angular.element(document.querySelector('#myCtr'))
    

    Angular 提供了一个等效于 $(document ).ready() 的函数,称为 angular.element(document).ready(),我们可以使用它。

    但您还需要获取 scope 并在 scope.$apply() 中执行您的更改,以便 Angular 知道您已经更改了一些它应该知道的内容。

    结合我们得到的两者:

    angular.element(document).ready(function () {
    
       var elem = angular.element($('#myCtr'));
       //get the injector.
       var injector = elem.injector();   
    
       scope= elem.scope();
    
       scope.$apply(function() {
          injector.get('cartFactory').cart.quantity = 1;
       });
    });
    

    updated plnkr

    【讨论】:

    • 嗨 KayakDave,非常感谢您的帮助。在这种情况下,我试图说明我尝试在角度代码之外(来自遗留代码部分)操纵服务数据的情况,这就是我尝试使用该元素获取注入器的原因。所以我猜你是对的,dom 还没有构建,也许我可以通过将我的代码放入控制器外部的超时块来模拟?
    • 是否可以让 Angular 调用您的旧代码并让它知道 Angular 已完成引导?
    • 当然,如果 Angular 在引导完成时有回调,我当然可以将该代码放入我的代码中。
    • 另外,我试过这个(现在超时)。这次似乎没有任何错误,新值没有更新回范围?你认为我必须在这里使用手表吗?
    • 我更新了答案——你不需要手表,但你需要我添加的scope.$apply
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-07-02
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多