Во-первых, вам нужно иметь четкое представление о scope и поведении ключевого слова this в контексте scope.
scope
there are two types of scope in javascript. They are :
1) Global Scope
2) Function Scope
, глобальная область относится к объекту window.Variables, объявленные в глобальной области, доступны из любого места. С другой стороны, область функций находится внутри функции. varariable this ключевое слово в глобальной области относится к объекту window. this внутренняя функция также относится к объекту window.So this всегда будет обратитесь к окну, пока мы не найдем способ манипулировать scope , чтобы указать контекст по собственному выбору.
--------------------------------------------------------------------------------
- -
- Global Scope -
- ( globally "this" refers to window object) -
- -
- function outer_function(callback){ -
- -
- // outer function scope -
- // inside outer function"this" keyword refers to window object - -
- callback() // "this" inside callback also refers window object -
- } -
- -
- function callback_function(){ -
- -
- // function to be passed as callback -
- -
- // here "THIS" refers to window object also -
- -
- } -
- -
- outer_function(callback_function) -
- // invoke with callback -
--------------------------------------------------------------------------------
this
Здесь у меня есть функция-конструктор, называемая Person. Он имеет свойство, называемое name, и четыре метода, называемые this , sayNameVersion2, sayNameVersion3, sayNameVersion4. Все четыре из них имеют одну конкретную задачу. Возьмите обратный вызов и вызовите его. Обратный вызов имеет определенную задачу, которая заключается в регистрации свойства имени экземпляра функции конструктора Person.
function Person(name){
this.name = name
this.sayNameVersion1 = function(callback){
callback.bind(this)()
}
this.sayNameVersion2 = function(callback){
callback()
}
this.sayNameVersion3 = function(callback){
callback.call(this)
}
this.sayNameVersion4 = function(callback){
callback.apply(this)
}
}
function niceCallback(){
// function to be used as callback
var parentObject = this
console.log(parentObject)
}
Теперь давайте создадим экземпляр из конструктора человека и вызывать разные версии name (X относится к 1,2,3,4) методу с niceCallback, чтобы увидеть, как много способов мы можем манипулировать sayNameVersion2 внутри обратного вызова для обращения к экземпляру person.
var p1 = new Person('zami') // create an instance of Person constructor
bind:
Что нужно сделать, так это создать новую функцию с помощью niceCallback установлено на предоставленное значение.
sayNameVersion1 и sayNameVersion2 используют bind для управления this функции обратного вызова.
this.sayNameVersion1 = function(callback){
callback.bind(this)()
}
this.sayNameVersion2 = function(callback){
callback()
}
сначала связать this с обратным вызовом внутри самого метода. И для второго обратного вызова передается связанный с ним объект.
p1.sayNameVersion1(niceCallback) // pass simply the callback and bind happens inside the sayNameVersion1 method
p1.sayNameVersion2(niceCallback.bind(p1)) // uses bind before passing callback
Метод first argument метода person используется как sayNameVersion3 внутри функция, которая вызывается с помощью call
sayNameVersion3 использует first argument , чтобы манипулировать this, чтобы ссылаться на созданный нами объект person вместо объекта window. [ ! d44] this.sayNameVersion3 = function(callback){
callback.call(this)
}
и он называется следующим:
p1.sayNameVersion3(niceCallback)
bind:
Как и this , первый аргумент call относится к объекту, который будет обозначен ключевым словом this.
sayNameVersion4 использует this , чтобы манипулировать this, чтобы ссылаться на объект person
this.sayNameVersion4 = function(callback){
callback.apply(this)
}
, и он называется следующим. Просто передается обратный вызов,
p1.sayNameVersion4(niceCallback)
Вы должны привязать каждый вход к другому значению. В настоящее время все они связаны с полем operations
в области с помощью ng-model="operations"
.
Я предлагаю вам создать массив operations
в вашем контроллере следующим образом:
$scope.operations = new Array($scope.operations_publish.length);
Затем вы можете привязать флажки к соответствующему индексу в этом массиве:
<span ng-repeat="operation in operations_publish">
<input type="checkbox"
name="operations"
ng-model="operations[$index]"
value="{{operation}}"/>
{{operation}}
</span>
Это даст вам массив с true
во всех проверенных индексах. Если вы хотите, чтобы выбранные значения были строками в массиве, вы можете их собрать следующим образом:
function getSelected() {
return $scope.operations_publish.filter(function (x,i) {
return $scope.operations[i]
});
}
Проверьте полный код этого скрипта .
Вы пытались?
<input type="checkbox" ng-model="cbValues[$index]"
ng-repeat="value in cbValues track by $index" />
Работает для меня: http://plnkr.co/edit/s0rZiMeL4NvpFZ3C9CIL?p=preview
В соответствии с вашим примером, указанным здесь, вы привязали свой ng-model
к выражению operations
, однако вам нужно привязать его к отдельному итератору operation
(from) ng-repeat="operation in operations_publish"
.
Затем вы можете установить эти данные в свой объект dataLog:
var dataObj = {
"operationType" : $scope.operationType,
"conceptModelID" : $scope.conceptID,
"requestor" : $scope.requestor,
"status" : "new",
"requestDateTime" : null,
"lastExecutedDateTime" : null,
"completedDateTime" : null,
"instructions" : $scope.operations_publish
};
Связывание данных по умолчанию в угловых многонаправленных, поэтому:
operations_publish
=> связанный с строкой через итератор operation
operation
=> привязан к значению флажка через ng-model