this
- одна из неправильно понятых концепций в JavaScript, потому что она ведет себя совсем не так, как с места на место. Просто this
ссылается на «владельца» функции, которую мы сейчас выполняем.
this
помогает получить текущий объект (контекст выполнения a.k.a.), с которым мы работаем. Если вы понимаете, в каком объекте выполняется текущая функция, вы можете легко понять, что текущий this
is
var val = "window.val"
var obj = {
val: "obj.val",
innerMethod: function () {
var val = "obj.val.inner",
func = function () {
var self = this;
return self.val;
};
return func;
},
outerMethod: function(){
return this.val;
}
};
//This actually gets executed inside window object
console.log(obj.innerMethod()()); //returns window.val
//Breakdown in to 2 lines explains this in detail
var _inn = obj.innerMethod();
console.log(_inn()); //returns window.val
console.log(obj.outerMethod()); //returns obj.val
Выше мы создаем 3 переменные с одинаковым именем «val». Один в глобальном контексте, один внутри obj и другой внутри innerMethod obj. JavaScript разрешает идентификаторы в определенном контексте, поднимая цепочку областей действия из локального глобального.
Несколько мест, где this
можно дифференцировать
var status = 1;
var helper = {
status : 2,
getStatus: function () {
return this.status;
}
};
var theStatus1 = helper.getStatus(); //line1
console.log(theStatus1); //2
var theStatus2 = helper.getStatus;
console.log(theStatus2()); //1
Когда line1, JavaScript устанавливает контекст выполнения (EC) для вызова функции, устанавливая this
объекту, на который ссылается все, что было до последнего «.». поэтому в последней строке вы можете понять, что a()
был выполнен в глобальном контексте, который является window
.
this
можно использовать для ссылки на создаваемый объект
function Person(name){
this.personName = name;
this.sayHello = function(){
return "Hello " + this.personName;
}
}
var person1 = new Person('Scott');
console.log(person1.sayHello()); //Hello Scott
var person2 = new Person('Hugh');
var sayHelloP2 = person2.sayHello;
console.log(sayHelloP2()); //Hello undefined
Когда выполняется новый Person()
, создается совершенно новый объект. Вызывается Person
и его this
установлен для ссылки на этот новый объект.
function testFunc() {
this.name = "Name";
this.myCustomAttribute = "Custom Attribute";
return this;
}
var whatIsThis = testFunc();
console.log(whatIsThis); //window
var whatIsThis2 = new testFunc();
console.log(whatIsThis2); //testFunc() / object
console.log(window.myCustomAttribute); //Custom Attribute
Если мы пропустим ключевое слово new
, whatIsThis
ссылается на самый глобальный контекст, он может найти (window
)
Если обработчик события является встроенным, this
ссылается на глобальный объект
При добавлении обработчика событий через JavaScript, this
относится к элементу DOM, который генерирует событие.
.apply()
.call()
и .bind()
var that = this
в JavaScript
Поместите файлы мультиплатформенных значков в ваш проект .NetStandard как Embedded Resources . Это означает, что я нашел все различные разрешения, предоставленные Google (_xxhdpi, _xhdpi, _hdpi, _mdpi и т. Д.), А затем переименовал их в следующее:
А затем поместите их в папку Resources / Google в моем проекте ( FormsFirebase.Ui ). Так, например, EmbeddedResourceId для первого файла в приведенном выше списке - FormsFirebase.Ui.Resources.Google.icon@¾x.png
.
Как вы вскоре увидите, переименование этих файлов, как показано выше, позволит Forms9Patch.Button
выбрать правильное изображение для правильного разрешения экрана (так, чтобы оно выглядело великолепно) - избавляя вас от необходимости управлять этим. Аналогично, включение их в проект .NetStandard означает, что они доступны для всех платформ - освобождая вас от необходимости разбираться с этим несколько раз!
В вашем Forms9Patch.Button
см. выше значок изображения в разрешении независимой моды. Это можно сделать несколькими способами. Один из более подробных способов:
var myButton = new Forms9Patch.Button
{
Text = "Sign in with xxhdpi",
TextColor=Color.White,
FontSize=14,
FontFamily="sans-serif",
WidthRequest=60,
IconImage = new Forms9Patch.Image
{
Source = Forms9Patch.ImageSource.FromMultiResource("FormsFirebase.Ui.Resources.Google.icon", GetType().Assembly),
Padding = 1,
},
Spacing = 4,
TintIcon = false,
BackgroundColor = Color.FromRGB(81,134,236)
};
Несколько замечаний:
Во-первых, я установил TintIcon
в false
, чтобы не подкрасил значок в тот же цвет, что и TextColor
. Также я установил IconImage
, а не BackgroundImage
. Это необходимо для того, чтобы убедиться, что изображение равноценно тексту, а не слою под ним.
Также обратите внимание, что я могу установить отступы IconImage
, а также Forms9Patch.Button.Padding
и Forms9Patch.Button.Spacing
(расстояние между IconImage
и [ 1113] или HtmlText
, в зависимости от того, было ли для HasTightSpacing
установлено значение true).
Вместо использования нескольких файлов .png
(для каждого разрешения экрана), если у вас есть .svg
версия вашего изображения, вы можете использовать ее вместо этого. Гораздо меньше работы!
Еще одна вещь, которая может вас заинтересовать: подобно тому, как Forms9Patch обрабатывает изображения независимо от платформы (помещая их в кроссплатформенный проект в качестве встроенных ресурсов), он может сделать то же самое со шрифтами. Это означает, что вы можете поместить файл шрифта (.ttf или .otf) в ваш кроссплатформенный проект и использовать его EmbeddedResourceId в качестве значения для FontFamily
. И это поведение может быть расширено до элементов Xamarin.Forms с помощью Forms9Patch.EmbeddedResourceFontEffect
.
Теперь немного прозелитизма (извините, если это не относится к вам): я вижу, что вы использовали XAML в качестве примера кода. Обратите внимание, что я не в своем ответе. Если вы новичок в .Net и / или Xamarin.Forms, я настоятельно рекомендую не использовать XAML. Не поймите меня неправильно, XAML великолепен - он просто не для начинающих. Зачем? Слишком много вещей происходит под одеялом, которые, как новичок, могут сбить вас с толку и замедлить. Скорее, я бы порекомендовал вам написать весь ваш пользовательский интерфейс на C #, чтобы вы могли научиться управлять своими свойствами и узнать, как на самом деле работает привязка. Как только вы освоите создание очень эффективных макетов с наилучшим «контекстно-зависимым» использованием связывания, тогда вы готовы к XAML. Для меня настоящим тестом была возможность сделать очень сложную разметку ячейки в большом списке в ListView плавно прокручивать на недорогом телефоне Android. После этого опыта я смог воспользоваться всеми преимуществами разработки на XAML (и их немало), не беспокоясь о том, что меня сковывают мои ошибки новичка.