AngularJS:为什么(显然)没有必要为ng-model声明变量?

时间:2016-08-11 00:38:31

标签: javascript angularjs

其他人很可能对这种现象感到困惑,所以我在这里发布这个问题。

HTML

<select 
    ng-model="cont.selectedItem" 
    ng-options="item.name for item in cont.lists.items" >
</select>

//"cont" indicates the controller. $scope is not used here

<span ng-click="addNewItem()">add</span>

JS

var instance = this;
instance.list = { ...item instances... };
instance.selectedItem;//Is it really necessary?

instance.addNewItem = function() {
  var  item = instance.selectedItem;
  ...
}

我曾经认为selectedItem中使用的ng-model必须在JS中声明为instance.selectedItem,以便我可以看到itemng-optionsvar item中选择。

但是,我注意到addNewItem函数中的instance.selectedItem获取了所选项目,即使public class Graph { public void generateGraph(int VertexNum, int numOfEdges) throws ZeroVerticesException, DisjointGraphException{ //Statements } //More methods } 被注释掉

我去了Angular的文档,但我找不到原因。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

在您的情况下,您在控制器的this上下文中定义了一个基本类型变量,默认情况下,selectedItem的值未定义,因为this已经定义了:)。在此时,角度$parser设置一个值。这个操作非常简单。在幕后$parse为你做这件事。

让我向您展示另一个示例,您可以在其中看到$parse API提供的实际魔力。假设您要设置model.something的值,其中model对象尚未定义。让我们将该值传递给$parse API并为其指定一些值(请参阅下面的代码可以帮助您理解)。将model.something值赋给ng-model指令时,会发生同样的情况。每当您更改ng-modelassign时,它的值为其上下文的基础变量。

以下是说明$parse如何运作的示例。

mainMod.controller('MainCtrl', ['$parse','$interpolate','$compile',
    function ($parse,$interpolate,$compile) {
         var vm = this; 

         //$parse
         vm.parse = $parse('model.something');
         //assigning value to `model.something` from `vm`
         //so the value is going to put inside `vm`
         //while assigning a value it check that value exists or not
         //if it isn't exist then it creates an value inside mentioned context
         //here context is `vm`(this)
         vm.parse.assign(vm, 'Pankaj'); 
         console.log(vm.model); //vm.model will have { something: 'Prakash' }
    }
]);